[
  {
    "path": ".clang-format",
    "content": "# Commented out parameters are those with the same value as base LLVM style.\n# We can uncomment them if we want to change their value, or enforce the\n# chosen value in case the base style changes (last sync: Clang 14.0).\n---\n### General config, applies to all languages ###\nBasedOnStyle: LLVM\nAccessModifierOffset: -4\nAlignAfterOpenBracket: DontAlign\nAlignOperands:   DontAlign\nAlignTrailingComments: false\nAllowAllParametersOfDeclarationOnNextLine: false\nBreakConstructorInitializers: AfterColon\nColumnLimit:     0\nConstructorInitializerIndentWidth: 8\nContinuationIndentWidth: 8\nCpp11BracedListStyle: false\nConstructorInitializerAllOnOneLineOrOnePerLine: true\nIncludeCategories:\n  - Regex:           '\".*\"'\n    Priority:        1\n  - Regex:           '^<.*\\.h>'\n    Priority:        2\n  - Regex:           '^<.*'\n    Priority:        3\nIndentCaseLabels: true\nIndentWidth:     4\nKeepEmptyLinesAtTheStartOfBlocks: false\nSpacesInLineCommentPrefix:\n  Minimum:         0\n  Maximum:         -1\nTabWidth:        4\nUseTab:          false\n\n---\n### C++ specific config ###\nLanguage:        Cpp\nStandard:        c++17\n---\n### ObjC specific config ###\nLanguage:        ObjC\nObjCBlockIndentWidth: 4\n---\n### Java specific config ###\nLanguage:        Java\nJavaImportGroups: ['org.godotengine', 'android', 'androidx', 'com.android', 'com.google', 'java', 'javax']\n...\n"
  },
  {
    "path": ".editorconfig",
    "content": "# EditorConfig is awesome: https://EditorConfig.org\n\n# top-most EditorConfig file\nroot = true\n\n[*]\nindent_style = space\nindent_size = 2\nend_of_line = lf\ncharset = utf-8\ntrim_trailing_whitespace = false\ninsert_final_newline = false\n\n[*.{h,hpp,cpp,gd}]\nindent_style = tab\nindent_size = 4"
  },
  {
    "path": ".gitattributes",
    "content": "# Normalize EOL for all files that Git considers text files.\n* text=auto eol=lf"
  },
  {
    "path": ".github/FUNDING.yml",
    "content": "github: 3ddelano\ncustom: https://www.buymeacoffee.com/3ddelano\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "content": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: ''\nlabels: ''\nassignees: 3ddelano\n\n---\n\n**Describe the bug**\nA clear and concise description of what the bug is.\n\n**To Reproduce**\nMinimal steps to reproduce the behavior:\n1. Go to '...'\n2. Click on '....'\n3. Scroll down to '....'\n4. See error\n\n(or provide link to minimal reproducible project)\n\n**Expected behavior**\nA clear and concise description of what you expected to happen.\n\n**Screenshots**\nIf applicable, add screenshots to help explain your problem.\n\n**Operating System:**\n - Version: [e.g. iOS 18.2, macOS arm64 15.2]\n\n**Plugin version:**\n- Version [e.g. v2.1.5]\n\n**Godot version:**\n- Version [e.g. v4.2]\n\n**Additional context**\nAdd any other context about the problem here.\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "content": "---\nname: Feature request\nabout: Suggest an idea for this project\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n**Is your feature request related to a problem? Please describe.**\nA clear and concise description of what the problem is. Ex. I'm always frustrated when [...]\n\n**Describe the solution you'd like**\nA clear and concise description of what you want to happen.\n\n**Describe alternatives you've considered**\nA clear and concise description of any alternative solutions or features you've considered.\n\n**Additional context**\nAdd any other context or screenshots about the feature request here.\n"
  },
  {
    "path": ".github/workflows/build.yml",
    "content": "name: 🛠️ Builds\non:\n  workflow_dispatch:\n  push:\n    branches:\n      - \"*\"\n    tags:\n      - \"*\"\njobs:\n  build:\n    runs-on: ${{ matrix.runner }}\n    name: ${{ matrix.name }}\n    strategy:\n      fail-fast: false\n      matrix:\n        include:\n          - identifier: linux-x86-64-debug\n            name: 🐧 Linux x86_64 Debug\n            runner: ubuntu-24.04\n            target: template_debug\n            dev_build: yes\n            platform: linux\n            arch: x86_64\n          - identifier: linux-x86-64-release\n            name: 🐧Linux x86_64 Release\n            runner: ubuntu-24.04\n            target: template_release\n            dev_build: no\n            platform: linux\n            arch: x86_64\n          - identifier: linux-arm64-debug\n            name: 🐧 Linux arm64 Debug\n            runner: ubuntu-24.04-arm\n            target: template_debug\n            dev_build: yes\n            platform: linux\n            arch: arm64\n          - identifier: linux-arm64-release\n            name: 🐧Linux arm64 Release\n            runner: ubuntu-24.04-arm\n            target: template_release\n            dev_build: no\n            platform: linux\n            arch: arm64\n          - identifier: macos-debug\n            name: 🍎 macOS (universal) Debug\n            runner: macos-latest\n            target: template_debug\n            dev_build: yes\n            platform: macos\n            arch: universal\n          - identifier: macos-release\n            name: 🍎 macOS (universal) Release\n            runner: macos-latest\n            target: template_release\n            dev_build: no\n            platform: macos\n            arch: universal\n          - identifier: windows-debug\n            name: 🏁 Windows Debug\n            runner: windows-latest\n            target: template_debug\n            dev_build: yes\n            platform: windows\n            arch: x86_64\n          - identifier: windows-release\n            name: 🏁 Windows Release\n            runner: windows-latest\n            target: template_release\n            dev_build: no\n            platform: windows\n            arch: x86_64\n          - identifier: android-arm64-debug\n            name: 🤖 Android arm64 Debug\n            runner: ubuntu-24.04\n            target: template_debug\n            dev_build: yes\n            platform: android\n            arch: arm64\n          - identifier: android-arm64-release\n            name: 🤖 Android arm64 Release\n            runner: ubuntu-24.04\n            target: template_release\n            dev_build: no\n            platform: android\n            arch: arm64\n          - identifier: android-x86_64-debug\n            name: 🤖 Android x86_64 Debug\n            runner: ubuntu-24.04\n            target: template_debug\n            dev_build: yes\n            platform: android\n            arch: x86_64\n          - identifier: android-x86_64-release\n            name: 🤖 Android x86_64 Release\n            runner: ubuntu-24.04\n            target: template_release\n            dev_build: no\n            platform: android\n            arch: x86_64\n          - identifier: ios-arm64-all\n            name: 🍏 iOS (arm64) All\n            runner: macos-latest\n            platform: ios\n    steps:\n      - name: Set up Python\n        uses: actions/setup-python@v5\n        with:\n          python-version: \"3.x\"\n\n      - name: Set up SCons\n        shell: bash\n        run: |\n          python -c \"import sys; print(sys.version)\"\n          python -m pip install scons\n          scons --version\n\n      - name: Checkout project\n        uses: actions/checkout@v4\n        with:\n          submodules: false\n\n      - name: Checkout godot-cpp\n        uses: actions/checkout@v4\n        with:\n          repository: godotengine/godot-cpp\n          path: godot-cpp\n          submodules: recursive\n          ref: \"godot-4.2-stable\"\n\n      - name: Checkout private EOS SDK mirror repo\n        uses: actions/checkout@v4\n        with:\n          token: \"${{secrets.EOS_SDK_MIRROR_PAT}}\"\n          repository: 3ddelano/eos-sdk-mirror\n          path: thirdparty/eos-sdk\n          ref: \"dd294d8d5d175840f61775a527332560ba81afa4\"\n\n      - name: (Windows) Install mingw64\n        if: ${{ matrix.platform == 'windows' }}\n        # change to egor-tensin/setup-mingw@v2 once pr #16 is merged\n        uses: 3ddelano/setup-mingw@patch-1\n\n      - name: (Linux) Install dependencies\n        if: ${{ matrix.platform == 'linux' }}\n        run: |\n          sudo apt-get update -qq\n          sudo apt-get install -qqq build-essential pkg-config\n\n      - name: (Android) Install dependencies\n        if: ${{ matrix.platform == 'android' }}\n        uses: nttld/setup-ndk@v1\n        with:\n          ndk-version: r23c\n          link-to-sdk: true\n\n      - name: Setup build cache\n        uses: actions/cache@v4\n        with:\n          path: ${{ github.workspace }}/.scons-cache/\n          key: ${{ matrix.identifier }}\n          restore-keys: |\n            ${{ matrix.identifier }}\n        continue-on-error: true\n\n      - name: Compile extension\n        shell: sh\n        if: ${{ matrix.platform != 'ios' }}\n        env:\n          SCONS_CACHE: ${{ github.workspace }}/.scons-cache/\n          SCONS_CACHE_LIMIT: 7168\n        run: |\n          scons target='${{ matrix.target }}' platform='${{ matrix.platform }}' arch='${{ matrix.arch }}' dev_build='${{ matrix.dev_build }}'\n\n      - name: (iOS) Compile extension\n        shell: sh\n        if: ${{ matrix.platform == 'ios' }}\n        env:\n          SCONS_CACHE: ${{ github.workspace }}/.scons-cache/\n          SCONS_CACHE_LIMIT: 7168\n        run: |\n          chmod +x ./build-ios.sh && ./build-ios.sh\n\n      - name: Copy extra files to addon folder\n        shell: sh\n        run: |\n          cp -n '${{ github.workspace }}/README.md' '${{ github.workspace }}/LICENSE.md' '${{ github.workspace }}/sample/addons/epic-online-services-godot/'\n\n      - name: Create artifact folder\n        shell: sh\n        run: |\n          mkdir -p '${{ github.workspace }}/artifact-${{ matrix.identifier }}/${{ github.event.repository.name }}/'\n\n      - name: Copy addons folder to artifact folder\n        shell: sh\n        run: |\n          cp -n -r '${{ github.workspace }}/sample/addons' '${{ github.workspace }}/artifact-${{ matrix.identifier }}/${{ github.event.repository.name }}/'\n\n      - name: (Windows) Delete compilation files\n        if: ${{ matrix.platform == 'windows' }}\n        run: |\n          Remove-Item ${{ github.workspace }}/artifact-${{ matrix.identifier }}/${{ github.event.repository.name }}/addons/epic-online-services-godot/bin/windows/* -Include *.exp,*.lib,*.ilk -Force\n\n      - name: Upload artifact\n        uses: actions/upload-artifact@v4\n        with:\n          name: ${{ github.event.repository.name }}-${{ matrix.identifier }}-${{ github.sha }}\n          path: |\n            ${{ github.workspace }}/artifact-${{ matrix.identifier }}/\n          compression-level: 9\n          retention-days: 14\n\n  merge-platforms:\n    runs-on: ubuntu-latest\n    needs: build\n    strategy:\n      fail-fast: false\n      matrix:\n        include:\n          - identifier: linux-x86_64\n            name: 🐧 Linux\n            matchpattern: linux\n          - identifier: macos-universal\n            name: 🍎 macOS (universal)\n            matchpattern: macos\n          - identifier: windows\n            name: 🏁 Windows\n            matchpattern: windows\n          - identifier: android\n            name: 🤖 Android\n            matchpattern: android\n          - identifier: ios\n            name: 🍏 iOS\n            matchpattern: ios\n\n    steps:\n      - name: Merge artifacts for platform\n        uses: actions/upload-artifact/merge@v4\n        with:\n          name: ${{ github.event.repository.name }}-${{ matrix.matchpattern }}-${{ github.sha }}\n          pattern: ${{ github.event.repository.name }}-${{ matrix.matchpattern }}*\n          compression-level: 9\n          retention-days: 14\n\n  merge-all:\n    runs-on: ubuntu-latest\n    needs: merge-platforms\n    steps:\n      - name: Merge artifacts into single\n        uses: actions/upload-artifact/merge@v4\n        with:\n          name: ${{ github.event.repository.name }}-all-${{ github.sha }}\n          pattern: ${{ github.event.repository.name }}-*\n          compression-level: 9\n          retention-days: 14\n\n  upload-to-release:\n    if: startsWith(github.ref, 'refs/tags/')\n    runs-on: ubuntu-latest\n    needs: merge-all\n    permissions:\n      contents: write\n    steps:\n      - name: Download 'all' artifact\n        uses: actions/download-artifact@v4\n        with:\n          name: ${{ github.event.repository.name }}-all-${{ github.sha }}\n          path: artifact-all\n      - name: Download 'android' artifact\n        uses: actions/download-artifact@v4\n        with:\n          name: ${{ github.event.repository.name }}-android-${{ github.sha }}\n          path: artifact-android\n      - name: Download 'macos' artifact\n        uses: actions/download-artifact@v4\n        with:\n          name: ${{ github.event.repository.name }}-macos-${{ github.sha }}\n          path: artifact-macos\n      - name: Download 'linux' artifact\n        uses: actions/download-artifact@v4\n        with:\n          name: ${{ github.event.repository.name }}-linux-${{ github.sha }}\n          path: artifact-linux\n      - name: Download 'windows' artifact\n        uses: actions/download-artifact@v4\n        with:\n          name: ${{ github.event.repository.name }}-windows-${{ github.sha }}\n          path: artifact-windows\n      - name: Download 'ios' artifact\n        uses: actions/download-artifact@v4\n        with:\n          name: ${{ github.event.repository.name }}-ios-${{ github.sha }}\n          path: artifact-ios\n\n      - name: Zip 'all' artifact\n        run: |\n          cd artifact-all\n          zip -9 -r ../${{ github.event.repository.name }}-all-${{ github.sha }}.zip .\n          cd ..\n      - name: Zip 'android' artifact\n        run: |\n          cd artifact-android\n          zip -9 -r ../${{ github.event.repository.name }}-android-${{ github.sha }}.zip .\n          cd ..\n      - name: Zip 'macos' artifact\n        run: |\n          cd artifact-macos\n          zip -9 -r ../${{ github.event.repository.name }}-macos-${{ github.sha }}.zip .\n          cd ..\n      - name: Zip 'linux' artifact\n        run: |\n          cd artifact-linux\n          zip -9 -r ../${{ github.event.repository.name }}-linux-${{ github.sha }}.zip .\n          cd ..\n      - name: Zip 'windows' artifact\n        run: |\n          cd artifact-windows\n          zip -9 -r ../${{ github.event.repository.name }}-windows-${{ github.sha }}.zip .\n          cd ..\n      - name: Zip 'ios' artifact\n        run: |\n          cd artifact-ios\n          zip -9 -r ../${{ github.event.repository.name }}-ios-${{ github.sha }}.zip .\n          cd ..\n\n      - name: Create draft release and upload assets\n        uses: softprops/action-gh-release@v2\n        if: startsWith(github.ref, 'refs/tags/')\n        with:\n          tag_name: ${{ github.ref_name }}\n          draft: true\n          files: |\n            ${{github.event.repository.name}}-all-${{ github.sha }}.zip\n            ${{github.event.repository.name}}-android-${{ github.sha }}.zip\n            ${{github.event.repository.name}}-macos-${{ github.sha }}.zip\n            ${{github.event.repository.name}}-linux-${{ github.sha }}.zip\n            ${{github.event.repository.name}}-windows-${{ github.sha }}.zip\n            ${{github.event.repository.name}}-ios-${{ github.sha }}.zip\n"
  },
  {
    "path": ".github/workflows/deploy-docs.yml",
    "content": "name: Deploy Docs to GitHub Pages\n\non:\n  push:\n    branches:\n      - \"*\"\n    # Review gh actions docs if you want to further define triggers, paths, etc\n    # https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#on\n\njobs:\n  build:\n    name: Build Docusaurus\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n      \n      - uses: oven-sh/setup-bun@v2\n\n      - name: Install dependencies\n        run: cd docs && bun install\n      \n      - name: Build website\n        run: cd docs && bun run build\n\n      - name: Upload Build Artifact\n        uses: actions/upload-pages-artifact@v3\n        with:\n          path: docs/build\n\n  deploy:\n    name: Deploy to GitHub Pages\n    needs: build\n    if: github.ref == 'refs/heads/main'\n\n    # Grant GITHUB_TOKEN the permissions required to make a Pages deployment\n    permissions:\n      pages: write # to deploy to Pages\n      id-token: write # to verify the deployment originates from an appropriate source\n\n    # Deploy to the github-pages environment\n    environment:\n      name: github-pages\n      url: ${{ steps.deployment.outputs.page_url }}\n\n    runs-on: ubuntu-latest\n    steps:\n      - name: Deploy to GitHub Pages\n        id: deployment\n        uses: actions/deploy-pages@v4"
  },
  {
    "path": ".gitignore",
    "content": "# Godot logs\nlogs/\n\ncache/\n.cache/\n\nsample/android\nsample/android_debug.keystore\n\n.DS_Store\n\n.env\nvc140.pdb\n.sconsign.dblite\n\n*.o\n*.obj\n*.os\n\n**/*.tmp\n\ntemp/\n\n.idea/\n\ncompile_commands.json\n\nepic-online-services-godot-addon.zip"
  },
  {
    "path": ".gitmodules",
    "content": "[submodule \"godot-cpp\"]\n\tpath = godot-cpp\n\turl = https://github.com/godotengine/godot-cpp\n\tbranch = 4.2\n[submodule \"thirdparty/eos-sdk\"]\n\tpath = thirdparty/eos-sdk\n\turl = https://github.com/3ddelano/eos-sdk-mirror.git\n"
  },
  {
    "path": ".pre-commit-config.yaml",
    "content": "repos:\n-   repo: https://github.com/ssciwr/clang-format-hook\n    rev: v16.0.2\n    hooks:\n    -   id: clang-format"
  },
  {
    "path": ".vscode/c_cpp_properties.json",
    "content": "{\n    \"configurations\": [\n        {\n            \"name\": \"Win32\",\n            \"includePath\": [\n                \"${workspaceFolder}/godot-cpp/**\",\n                \"${workspaceFolder}/godot-cpp/gen/include/**\",\n                \"${workspaceFolder}/godot-cpp/include/**\",\n                \"${workspaceFolder}/godot-cpp/gdextension/**\",\n                \"${workspaceFolder}/thirdparty/eos-sdk/SDK/Include/\",\n                \"${workspaceFolder}/thirdparty/eos-sdk/SDK/Include/**\",\n                \"${workspaceFolder}/src/**\",\n                \"${workspaceFolder}/src\"\n            ],\n            \"defines\": [\"_DEBUG\", \"UNICODE\", \"_UNICODE\"],\n            \"windowsSdkVersion\": \"10.0.19041.0\",\n            \"compilerPath\": \"cl.exe\",\n            \"cStandard\": \"c17\",\n            \"cppStandard\": \"c++17\",\n            \"intelliSenseMode\": \"windows-msvc-x64\"\n        }\n    ],\n    \"version\": 4\n}\n"
  },
  {
    "path": ".vscode/launch.json",
    "content": "{\n\t\"version\": \"0.2.0\",\n\t\"configurations\": [\n\t\t{\n\t\t\t\"name\": \"Debug Project (Windows)\",\n\t\t\t\"type\": \"cppvsdbg\",\n\t\t\t\"request\": \"launch\",\n\t\t\t\"program\": \"${config:godotTools.editorPath.godot4}\",\n\t\t\t\"args\": [\"--debug\"],\n\t\t\t\"stopAtEntry\": false,\n\t\t\t\"cwd\": \"${workspaceFolder}/sample\",\n\t\t\t\"environment\": [],\n\t\t\t\"console\": \"integratedTerminal\",\n\t\t\t\"preLaunchTask\": \"build\"\n\t\t},\n\t\t{\n\t\t\t\"name\": \"Debug Project (Macos)\",\n\t\t\t\"type\": \"cppdbg\",\n\t\t\t\"request\": \"launch\",\n\t\t\t\"program\": \"${config:godotTools.editorPath.godot4}\",\n\t\t\t\"args\": [\"--debug\"],\n\t\t\t\"stopAtEntry\": false,\n\t\t\t\"cwd\": \"${workspaceFolder}/sample\",\n\t\t\t\"environment\": [],\n\t\t\t\"console\": \"integratedTerminal\",\n\t\t\t\"MIMode\": \"lldb\",\n\t\t\t\"preLaunchTask\": \"build\"\n\t\t}\n\t]\n}\n"
  },
  {
    "path": ".vscode/settings.json",
    "content": "{\n  \"files.exclude\": {\n    \"**/*.obj\": true,\n    \"**/*.ilk\": true,\n    \"**/*.exp\": true,\n    \"**/*.pdb\": true,\n    \"**/__pycache__\": true,\n    \"**/*.os\": true,\n    \"**/*.o\": true\n  },\n  \"godot_tools.editor_path\": \"d:\\\\Projects\\\\Godot\\\\Godot_v4.exe\",\n  \"files.associations\": {\n    \"*.rmd\": \"markdown\",\n    \"utility\": \"cpp\",\n    \"sstream\": \"cpp\",\n    \"unordered_map\": \"cpp\",\n    \"algorithm\": \"cpp\",\n    \"chrono\": \"cpp\",\n    \"iterator\": \"cpp\",\n    \"xhash\": \"cpp\",\n    \"xtree\": \"cpp\",\n    \"xutility\": \"cpp\",\n    \"string\": \"cpp\",\n    \"type_traits\": \"cpp\",\n    \"deque\": \"cpp\",\n    \"forward_list\": \"cpp\",\n    \"list\": \"cpp\",\n    \"vector\": \"cpp\",\n    \"initializer_list\": \"cpp\"\n  },\n  \"grammarly.selectors\": [\n    {\n      \"language\": \"cpp\",\n      \"scheme\": \"file\"\n    }\n  ],\n  \"cmake.ignoreCMakeListsMissing\": true\n}\n"
  },
  {
    "path": ".vscode/tasks.json",
    "content": "{\n    \"version\": \"2.0.0\",\n    \"tasks\": [\n        {\n            \"label\": \"build\",\n            \"group\": \"build\",\n            \"type\": \"shell\",\n            \"command\": \"scons\",\n            \"args\": [\"dev_build=yes\"],\n            \"problemMatcher\": \"$msCompile\"\n        },\n        {\n            \"label\": \"build-release\",\n            \"group\": \"build\",\n            \"type\": \"shell\",\n            \"command\": \"scons\",\n            \"args\": [\"target=template_release\"],\n            \"problemMatcher\": \"$msCompile\"\n        }\n    ]\n}\n"
  },
  {
    "path": "LICENSE.md",
    "content": "MIT License\n\nCopyright (c) 2022 Delano Lourenco\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE."
  },
  {
    "path": "README.md",
    "content": "# Epic Online Services Godot (EOSG)\n\n<img alt=\"Project Logo\" src=\"./_media/logo.png\" height=\"150\">\n\n### Easiest way to use Epic Online Services in Godot 4.2+ (includes demo project)\n\n<img alt=\"Godot3\" src=\"https://img.shields.io/badge/-Godot 4.2+-478CBF?style=for-the-badge&logo=godotengine&logoWidth=20&logoColor=white\" />\n&nbsp;&nbsp;&nbsp;<img alt=\"Epic Online Services 1.18.1.2\" src=\"https://img.shields.io/badge/-Epic Online Services 1.18.1.2-313131?style=for-the-badge&logo=epic-games&logoWidth=20&logoColor=white\" />\n\n> Supports Windows x64, Linux x64/arm64, Android x64/arm64, MacOS, iOS arm64 (iphone/simulator)\n\n> Disclaimer: This project is NOT affiliated with Epic Games Inc or Godot Engine. It doesn't endorse Epic Online\n> Services. This project and sample Godot scenes are provided solely for educational purposes and may or may not comply\n> with Epic Games' Design Guidelines, if you plan to release a game make sure you read\n> the [Guidelines](https://dev.epicgames.com/docs/services/en-US/EpicAccountServices/DesignGuidelines/index.html) and\n> any\n> other steps needed to release a public game like asking for user consent, option to delete user data, website with\n> privacy policy and license, etc.\n\n## This plugin has two main systems:\n\n- ### High Level EOS (Recommended)\n\n  The High Level Epic Online Services provides easy to use methods and signals to interact with EOS recommended for\n  beginners.\n\n- ### GDExtension EOS\n  The GDExtension EOS provides advanced EOS usage not recommended for beginners. See `EOS` and `IEOS` classes.\n\n## [🚀 Check out out GDAI MCP from the creator of EOSG](https://gdaimcp.com?ref=eosg-readme)\n\n<a href=\"https://gdaimcp.com?ref=eosg-readme\" target=\"_blank\">\n<img src=\"https://gdaimcp.com/images/og/gdai-mcp.png\" width=\"400\" />\n</a>\n\nSupercharge your Godot 4.2+ workflow with GDAI MCP – the ultimate Godot MCP server that lets AI tools like Claude,\nCursor, Windsurf, VSCode and more automate scene creation, node editing, reading godot errors, creating scripts,\ndebugging, and more.\n\nVibe code like never before!\n\n### 🔗 **[https://gdaimcp.com](https://gdaimcp.com?ref=eosg-readme)**\n\n# High Level Epic Online Services\n\nFollowing are the main classes in High Level Epic Online Services. They also have documentation in the Godot Editor:\n\n- ### HPlatform\n- ### HAuth\n- ### HAchievements\n- ### HFriends\n- ### HStats\n- ### HLeaderboards\n- ### HLobbies\n- ### HP2P\n- ### HLog\n\nA basic example of using High Level EOS:\n\n```GDScript\n# In main script\nextends Node\n\nfunc _ready() -> void:\n\t# Setup HEOS Logs\n\tHLog.log_level = HLog.LogLevel.INFO\n\n\tvar credentials = HCredentials.new()\n\tcredentials.product_name = \"PRODUCT_NAME_NAME\"\n\tcredentials.product_version = \"PRODUCT_VERSION_HERE\"\n\tcredentials.product_id = \"PRODUCT_ID_HERE\"\n\tcredentials.sandbox_id = \"SANDBOX_ID_HERE\"\n\tcredentials.deployment_id = \"DEPLOYMENT_ID_HERE\"\n\tcredentials.client_id = \"CLIENT_ID_HERE\"\n\tcredentials.client_secret = \"CLIENT_SECRET_HERE\"\n\t# optional\n\t#credentials.encryption_key = \"ENCRYPTION_KEY_HERE\"\n\n\tvar setup_success := await HPlatform.setup_eos_async(credentials)\n\tif not setup_success:\n\t    printerr(\"Failed to setup EOS. See logs for more details\")\n\t    return\n\n\t# Setup Logs from EOS\n\tHPlatform.log_msg.connect(_on_eos_log_msg)\n\tvar log_res := HPlatform.set_eos_log_level(EOS.Logging.LogCategory.AllCategories, EOS.Logging.LogLevel.Info)\n\tif not EOS.is_success(log_res):\n\t\tprinterr(\"Failed to set logging level\")\n\t\treturn\n\n\tHAuth.logged_in.connect(_on_logged_in)\n\n\t# During development use the devauth tool to login\n\tHAuth.login_devtool_async(\"localhost:4545\", \"CREDENTIAL_NAME_HERE\")\n\n\t# Or login without any credentials\n\t# await HAuth.login_anonymous_async()\n\n\nfunc _on_logged_in():\n\tprint(\"Logged in successfully: product_user_id=%s\" % HAuth.product_user_id)\n\n\t# Example: Get top records for a leaderboard\n\tvar records := await HLeaderboards.get_leaderboard_records_async(\"LEADERBOARD_ID_HERE\")\n\tprint(records)\n\n\nfunc _on_eos_log_msg(msg: EOS.Logging.LogMessage) -> void:\n\tprint(\"SDK %s | %s\" % [msg.category, msg.message])\n\n```\n\n# GDextension Epic Online Services\n\n## Features\n\n- Authentication (Epic Games, Steam, Discord, Anonymous etc)\n- Social Overlay on Windows\n- Achievements\n- Stats & Leaderboards\n- Lobby, Sessions and Multiplayer\n- Voice\n- Metrics\n- Mods\n- Player/Title data storage\n- Progression Snapshot\n- Reports and Sanctions\n- Ecommerce (Ecom Epic Games Store)\n- AntiCheat\n\n#### [View Current Project Status](#current-project-status)\n\n## Simple P2P Example\n\nA simple demo showcasing P2P multiplayer using Epic Online\nServices: [Click Here](https://github.com/3ddelano/EOSGP2PInterfaceTestGame)\n\n## Support Development\n\n#### Making this project took a lot of time and effort, reading the Epic Online Services documentation countless times and testing each method in Godot. I would really appreciate if you could support the project in any way.\n\n<a href=\"https://www.buymeacoffee.com/3ddelano\" target=\"_blank\"><img height=\"41\" width=\"174\" src=\"https://cdn.buymeacoffee.com/buttons/v2/default-red.png\" alt=\"Buy Me A Coffee\" width=\"150\" ></a>\n<br>\n<a href=\"https://github.com/sponsors/3ddelano\" target=\"_blank\">Github Sponsor</a>\n\n#### Want to support in other ways? Contact me on Discord: `@3ddelano`\n\nJoin the Discord server for discussing suggestions or bugs: [3ddelano Cafe](https://discord.gg/FZY9TqW)\n\n## [Demo Video (Youtube)](https://www.youtube.com/watch?v=ENyvF4yVjKg)\n\n[Watch the playlist](https://www.youtube.com/playlist?list=PL5t0hR7ADzun5JYF4e2a2FtZEWYHxK83_)\n\n[![Epic Online Services Tutorial series](https://img.youtube.com/vi/ENyvF4yVjKg/0.jpg)](https://www.youtube.com/playlist?list=PL5t0hR7ADzun5JYF4e2a2FtZEWYHxK83_)\n\n## [Documentation](http://localhost:3000/epic-online-services-godot/docs/introduction)\n\n## Screenshots\n\n- Windows\n  <img src=\"./_media/windows_auth_success.png\">\n\n- Android\n  <img src=\"./_media/android_auth_success.jpg\">\n\n   <img src=\"./_media/android_p2p_game.jpg\">\n\n- iOS\n  <img src=\"./_media/ios_simulator_auth_success.png\">\n\n- Cross platform lobbies\n  - iOS\n    <img src=\"./_media/ios_simulator_in_lobby.png\">\n  - macOS\n    <img src=\"./_media/mac_in_lobby.png\">\n\n## How does it work\n\nThis project uses GDExtension to wrap the `Epic Online Services C SDK` so that it can be easily used in Godot using\nGDScript, C#, etc with similar class hierarchy and static type support. It makes use of signals for sending events like\nuser login, logout, achievement unlock, etc.\n\n## Installation\n\nThis is a regular plugin for `Godot 4.2+`. To install the plugin follow the steps below:\n\n#### **Method 1: Install from Asset Library**\n\n1. Asset Library link: [View the plugin on Godot Asset Library](https://godotengine.org/asset-library/asset/2453)\n2. In the Godot editor, navigate to the `AssetLib` tab, and in the search bar type `EOSG`.\n3. Click on the plugin with name `Epic Online Services Godot (EOSG)` by `3ddelano`\n4. In the popup that opens, click the `Download` button.\n5. Once the download is done, click the `Install` button.\n6. Goto `Project->Project Settings->Plugins` and enable the `Epic Online Services Godot 4.2+ (EOSG)` plugin.\n7. Restart the godot editor.\n8. You can now use the plugin. Head to the [Documentation](#) for more information on how to use the plugin.\n\n#### **Method 2: Install from GitHub**\n\n1. Goto the Releases section and download\n   the [latest release](https://github.com/3ddelano/epic-online-services-godot/releases/latest)\n2. Extract the zip file and copy the `addons/epic-online-services-godot` folder into the `res://addons/` folder of your\n   project. If the `res://addons` does not exist, create it.\n3. In the Godot editor, goto `Project->Project Settings->Plugins` and enable the\n   `Epic Online Services Godot 4.2+ (EOSG)` plugin.\n4. Restart the godot editor.\n5. You can now use the plugin. Head to the [Documentation](#) for more information on how to use the plugin.\n\n## Development Setup\n\n#### Pre-requisites\n\n- Godot Engine 4.2+ (Get it here [Godot Engine Download](https://godotengine.org/download/))\n- Epic Online Services C SDK (Download from [Epic Developer Portal](https://dev.epicgames.com/portal/sdk))\n- Make sure you have accepted the Terms and Conditions\n  for [Epic Online Services](https://www.epicgames.com/site/en-US/tos?lang=en-US)\n- A product registered with Epic Games Services (Make one for\n  free [Epic Developer Portal](https://dev.epicgames.com/portal))\n\nTo develop this plugin, follow the below steps:\n\n1. Download/clone the repository.\n\n1. Run the command:\n  ```bash\n  git submodule update --init --recursive\n  ```\n\n1. Extract the `EOS C SDK` zip downloaded from Epic Games, rename it to `eos-sdk` and paste it in the `thirdparty/`\n   folder. Refer to the below folder structure.\n\n   <img src=\"./_media/eos_folder_structure.png\">\n\n1. Build the GDExtension plugin in debug mode (With debug symbols)\n\n   ```shell\n   # In root folder\n   scons platform=<platform> target=template_debug dev_build=yes\n   ```\n\n   Eg. `scons platform=windows target=template_debug dev_build=yes`\n\n1. Build the GDExtension plugin for release (Optimized)\n\n   ```shell\n   # In root folder\n   scons platform=windows target=template_release\n   ```\n\n1. The built GDExtension library will be in the `res://addons/epic-online-services-godot/bin/` folder of the sample\n   project.\n\n## Debugging GDExtension on MacOS\n\nIf you get an error `Not allowed to attach to process` trying to debug GDExtension on MacOS using LLDB. Run the below\ncommand:\n\n```bash\ncodesign --entitlements debug-entitlements.plist -f -s - /Applications/Godot.app/Contents/MacOS/Godot\n```\n\n### How to run the sample project?\n\n> The sample Godot project is located in the **sample** folder\n\n1. Clone/Download the repo.\n2. Download the [latest release](https://github.com/3ddelano/epic-online-services-godot/releases/latest) from the\n   Releases section and replace the existing `/addons/epic-online-services-godot` with the one from the Release (this\n   includes the built shared libraries).\n3. Copy your credentials (`Product Id`, `Sandbox Id`, `Deployment Id`, `Client Id`, `Client Secret`) of your Epic\n   Games \"Product\" from the Epic Games Dev Portal and paste them in `Main.gd` script in the relevant sections. The\n   encryption key is a random 64 character long string. These credentials need to be kept as private as possible. One\n   way is to make sure to encrypt all scripts when exporting the final game. (\n   See [Compiling with script key encryption](https://docs.godotengine.org/en/stable/development/compiling/compiling_with_script_encryption_key.html))\n\n4. Configure your Product on the EOS Dev Portal with the following configuration:\n\n- In the `Client Policies` section in `Product Settings`, for the Client policy type choose `Custom policy`, enable the\n  `User is required` and enable every features and action except `Connect` (Trusted Server Required). This will allow\n  the sample to access the different services provided by Epic Online Services. In your actual game, the client policy\n  is important and you should give minimal permissions to features.\n- In the `Permissions` section of `Epic Account Services`, enable all three: `Basic Profile`, `Online Presence` and\n  `Friends`.\n- (Optional if you want some pre-made achievements)\n  In the `Achievements` section in `Game Services`, use the `Bulk Import` option and import the `HelloProduct.zip` file\n  located at `res://HelloProduct.zip`\n\n### Bootstrapping Godot executable with Epic Online Services\n\nIf you want to use the `Account Portal` login option in Epic Online Services, you need to bootstrap the Godot/Game\nexecutable as needed by `EOS-SDK 1.15` and greater.\nSee [Redistributable Installer](https://dev.epicgames.com/docs/services/en-US/EpicAccountServices/Crossplayacrossplatforms/RedistributableInstaller/index.html)\n\nA sample of the generated `.ini` file for the Godot Editor is shown below (during game development):\n\n```\nApplicationPath=Godot_v4.2.0-stable_win64.exe\nWorkingDirectory=\nWaitForExit=0\nNoOperation=0\n```\n\nFollow the instructions\nin [Running the service for local development](https://dev.epicgames.com/docs/services/en-US/EpicAccountServices/Crossplayacrossplatforms/RedistributableInstaller/index.html#runningtheserviceforlocaldevelopment)\nand:\n\n- During game development\n\n  Bootstrap the Godot Editor executable (eg. `Godot_v4.2.0-stable_win64.exe`) to test the `Account Portal` login\n\n- After exporting the game\n\n  Bootstrap the exported game executable (eg. `My Amazing Game.exe`)\n\n## Exporting for Android\n\nUse a community created [Android Export Plugin](https://github.com/uno1982/EOSG-android-exporter)\n\nOr follow the steps below to manually export for Android.\n\n### Pre-requisites\n\n1. Setup the `Android Build Template` in your Godot project by following the\n   tutorial [Gradle builds for Andriod](https://docs.godotengine.org/en/stable/tutorials/export/android_gradle_build.html).\n   This will create an android project in `res://android/build`.\n\n2. Now with reference to the\n   tutorial [Add the EOS SDK to Your Android Studio Project](https://dev.epicgames.com/docs/epic-online-services/platforms/android#4-add-the-eos-sdk-to-your-android-studio-project),\n   perform the following steps.\n\n3. In the `res://android/build/build.gradle` file, add the following lines after the implementations in the\n   `dependencies` section.\n\n   Before\n\n   ```gradle\n   dependencies {\n       implementation libraries.kotlinStdLib\n       implementation libraries.androidxFragment\n       ... other code\n   ```\n\n   After\n\n   ```gradle\n   dependencies {\n       implementation libraries.kotlinStdLib\n       implementation libraries.androidxFragment\n\n       // EOS SDK dependencies\n       implementation 'androidx.appcompat:appcompat:1.5.1'\n       implementation 'androidx.constraintlayout:constraintlayout:2.1.4'\n       implementation 'androidx.security:security-crypto:1.0.0'\n       implementation 'androidx.browser:browser:1.4.0'\n       implementation 'androidx.webkit:webkit:1.7.0'\n       // Update the path so that it points to eossdk-StaticSTDC-release.aar provided in addons/epic-online-services-godot/bin/android/\n       implementation files('../../addons/epic-online-services-godot/bin/android/eossdk-StaticSTDC-release.aar')\n\n       ...other code\n   ```\n\n4. In the `res://android/build/build.gradle` file, add the following lines after the `defaultConfig` in the `android`\n   section.\n\n   Before\n\n   ```gradle\n   android {\n\n       ... other code\n\n       defaultConfig {\n           ... other code\n\n           // Feel free to modify the application id to your own.\n           applicationId getExportPackageName()\n           versionCode getExportVersionCode()\n           versionName getExportVersionName()\n           minSdkVersion getExportMinSdkVersion()\n           targetSdkVersion getExportTargetSdkVersion()\n\n           missingDimensionStrategy 'products', 'template'\n       }\n\n       ... other code\n   ```\n\n   After\n\n   ```gradle\n   android {\n\n       ... other code\n\n       defaultConfig {\n           ... other code\n\n           // Feel free to modify the application id to your own.\n           applicationId getExportPackageName()\n           versionCode getExportVersionCode()\n           versionName getExportVersionName()\n           minSdkVersion getExportMinSdkVersion()\n           targetSdkVersion getExportTargetSdkVersion()\n\n           missingDimensionStrategy 'products', 'template'\n\n           // This is needed by EOS Android SDK\n           String ClientId = \"PUT YOUR EOS CLIENT ID HERE\"\n           resValue(\"string\", \"eos_login_protocol_scheme\", \"eos.\" + ClientId.toLowerCase())\n       }\n\n       ... other code\n   ```\n\n5. In the `res://android/build/config.gradle` file, update the `minSdk` to `23` to match with the requirements of the\n   `EOS Android SDK`.\n\n   Before\n\n   ```gradle\n   minSdk             : 21,\n   ```\n\n   After\n\n   ```gradle\n   minSdk             : 23,\n   ```\n\n6. In the `res://android/build/src/com/godot/game/GodotGame.java` file, update it as follows.\n\n   ```java\n   package com.godot.game;\n\n   import com.epicgames.mobile.eossdk.EOSSDK;     // added\n   import org.godotengine.godot.GodotActivity;\n\n   import android.os.Bundle;\n\n   public class GodotApp extends GodotActivity {\n       static {                                   // added\n           System.loadLibrary(\"EOSSDK\");          // added\n       }                                          // added\n\n       @Override\n       public void onCreate(Bundle savedInstanceState) {\n           EOSSDK.init(getActivity());  // added\n\n           setTheme(R.style.GodotAppMainTheme);\n           super.onCreate(savedInstanceState);\n\n       }\n   }\n\n   ```\n\n7. Now open your project in the Godot Editor, and goto `Project -> Export` and create a new Android export profile.\n\n8. In the `Gradle Build` section, enable `Use Gradle Build`. In the `Architectures` section enable `arm64-v8a`. In the\n   `Permissions` section ensure that `ACESSS_NETWORK_STATE`, `ACCESS_WIFI_STATE` and `INTERNET` are enabled. These\n   permissions are needed for the EOS SDK to work. Fill in the other details such as package name, etc as needed.\n\n9. You can now export the Android APK by clicking the `Export Project` button.\n\n## Exporting for iOS\n\nExport the project from Godot editor for iOS target. You might get a build error during this process, ignore it. Open\nthe generated iOS project in XCode and build the project. The build should be successful. EOSG has support for iOS arm64\ndevice and iOS arm64 simulator.\n\n## Current Project Status\n\n- Completed with sample\n  - Auth Interface\n  - Achievements Interface\n  - Connect Interface\n  - CustomInvites Interface\n  - Friends Interface\n  - Stats Interface\n  - UserInfo Interface\n  - Leaderboards Interface\n  - Metrics Interface\n  - Mods Interface\n  - Presence Interface\n  - ProgressionSnapshot Interface\n  - Reports Interface\n  - UI Interface\n  - Lobby Interface (Also sample for manual audio input/output)\n  - RTC Interface\n  - RTCAudio Interface\n  - P2P Interface\n  - Version Interface\n\n- Completed without sample\n  - KWS Interface\n  - PlayerDataStorage Interface\n  - Sanctions Interface\n  - Sessions Interface\n  - TitleStorage Interface\n  - Ecom Interface\n  - AntiCheatServer Interface\n  - AntiCheatClient Interface\n\n- Not completed\n  - Integrated Platform Interface\n"
  },
  {
    "path": "SConstruct",
    "content": "#!/usr/bin/env python\nimport os\nimport shutil\n\nenv = SConscript(\"godot-cpp/SConstruct\")\nlib_name = \"libeosg\"\nplugin_bin_folder = \"sample/addons/epic-online-services-godot/bin\"\n\neos_sdk_folder = \"thirdparty/eos-sdk/SDK/\"\n\n\n# Add source files\nenv.Append(CPPPATH=[\"src/\", eos_sdk_folder + \"Include/\"])\nsources = Glob(\"src/*.cpp\")\nplatform = env[\"platform\"]\nbuild_target = env[\"target\"]\n\n\ndef copy_file(from_path, to_path):\n\tif not os.path.exists(os.path.dirname(to_path)):\n\t\tos.makedirs(os.path.dirname(to_path))\n\tshutil.copyfile(from_path, to_path)\n\ndef copy_folder(from_path, to_path):\n\tif not os.path.exists(to_path):\n\t\tos.makedirs(to_path)\n\tshutil.rmtree(to_path, ignore_errors=True)\n\tshutil.copytree(from_path, to_path)\n\ndef extract_eos_android_libraries():\n\tlibs_path = eos_sdk_folder + \"Bin/Android/static-stdc++/libs/\"\n\taar_file = eos_sdk_folder + \"Bin/Android/static-stdc++/aar/eossdk-StaticSTDC-release.aar\"\n\tzip_file = libs_path + \"eos-sdk.zip\"\n\t\n\t# Delete libs folder if exists\n\tshutil.rmtree(libs_path, ignore_errors=True)\n\t\n\t# Copy aar to zip file\n\tcopy_file(aar_file, zip_file)\n\t\n\t# Copy aar to plugin bin/android\n\tcopy_file(aar_file, plugin_bin_folder + \"/android/eossdk-StaticSTDC-release.aar\")\n\t\n\t# Create folder if doesnt exist\n\tif not os.path.exists(libs_path + \"extracted\"):\n\t\tos.makedirs(libs_path + \"extracted\")\n\n\t# Unzip the file\n\tshutil.unpack_archive(zip_file, libs_path + \"extracted\")\n\n\t# Copy all folders from libs_path+\"extracted/jni\" to libs_path\n\tfor folder in os.listdir(libs_path + \"extracted/jni\"):\n\t\tshutil.copytree(libs_path + \"extracted/jni/\" + folder, libs_path + folder)\n\t\n\t# Delete extracted folder\n\tshutil.rmtree(libs_path + \"extracted\", ignore_errors=True)\n\t\n\t# Delete zip file\n\tos.remove(zip_file)\n\n\ngenv = env\ndef on_complete(target, source, env):\n\tif platform == \"windows\":\n\t\tshutil.rmtree(plugin_bin_folder + \"/windows/x64\", ignore_errors=True)\n\t\tshutil.copytree(eos_sdk_folder + \"Bin/x64\", plugin_bin_folder + \"/windows/x64\")\n\t\tcopy_file(eos_sdk_folder + \"Bin/EOSSDK-Win64-Shipping.dll\", plugin_bin_folder + \"/windows/EOSSDK-Win64-Shipping.dll\")\n\t\n\telif platform == \"linux\":\n\t\tso_variant = \"LinuxArm64\" if genv[\"arch\"] == \"arm64\" else \"Linux\"\n\t\tcopy_file(eos_sdk_folder + f\"Bin/libEOSSDK-{so_variant}-Shipping.so\", plugin_bin_folder + f\"/linux/libEOSSDK-{so_variant}-Shipping.so\")\n\t\n\telif platform == \"macos\":\n\t\tframework_folder = plugin_bin_folder + f\"/macos/{lib_name}.{platform}.{build_target}.framework\"\n\t\t# Copies EOS dylib inside framework folder\n\t\tcopy_file(eos_sdk_folder + \"Bin/libEOSSDK-Mac-Shipping.dylib\", framework_folder + f\"/libEOSSDK-Mac-Shipping.dylib\")\n\t\tlib_path = f\"{framework_folder}/{lib_name}.{platform}.{build_target}\"\n\t\tprint(f\"Updating libEOSSDK-Mac-Shipping.dylib path in {lib_path}\")\n\t\tos.system(f\"install_name_tool -change @rpath/libEOSSDK-Mac-Shipping.dylib @loader_path/libEOSSDK-Mac-Shipping.dylib {lib_path}\")\n\n\n\n# For reference:\n# - CCFLAGS are compilation flags shared between C and C++\n# - CFLAGS are for C-specific compilation flags\n# - CXXFLAGS are for C++-specific compilation flags\n# - CPPFLAGS are for pre-processor flags\n# - CPPDEFINES are for pre-processor defines\n# - LINKFLAGS are for linking flags\n\n\nenv.Append(LIBPATH=[eos_sdk_folder + \"Lib/\"])\nenv.Append(LIBPATH=[eos_sdk_folder + \"Bin/\"])\nif env[\"platform\"] == \"windows\":\n\t# TODO: dont ignore this warning\n\t# this disables LINK : error LNK1218: warning treated as error;\n\t# so that it can build in github action with scons cache\n\tenv.Append(LINKFLAGS=[\"/ignore:4099\"])\n\t\n\tenv.Append(LIBS=[\"EOSSDK-Win64-Shipping\"])\n\nelif env[\"platform\"] == \"linux\":\n\tenv.Append(LINKFLAGS=[\"-static-libgcc\", \"-static-libstdc++\"])\n\tif env[\"arch\"] == \"arm64\":\n\t\tenv.Append(LIBS=[\"EOSSDK-LinuxArm64-Shipping\"])\n\telse:\n\t\tenv.Append(LIBS=[\"EOSSDK-Linux-Shipping\"])\n\nelif env[\"platform\"] == \"macos\":\n\tenv.Append(LIBS=[\"EOSSDK-Mac-Shipping\"])\n\nelif env[\"platform\"] == \"ios\":\n\tif env[\"arch\"] != \"arm64\":\n\t\traise Exception(\"Only arm64 is supported on iOS.\")\n\tcopy_folder(eos_sdk_folder + \"Bin/IOS/EOSSDK.xcframework\", plugin_bin_folder + \"/ios/EOSSDK.xcframework\")\n\t\n\tenv.Append(ENV={'IPHONEOS_DEPLOYMENT_TARGET': '15.0'})\n\n\tenv.Append(LINKFLAGS=[\n\t\t\"-F\", plugin_bin_folder + f\"/ios/EOSSDK.xcframework/ios-arm64{\"-simulator\" if env[\"ios_simulator\"] else \"\"}\",\n\t\t'-framework', 'AuthenticationServices',\n\t\t'-framework', 'EOSSDK',\n\t])\n\t\n\nelif env[\"platform\"] == \"android\":\n\teos_android_arch = \"arm64-v8a\"\n\tif env[\"arch\"] == \"x86_64\":\n\t\teos_android_arch = \"x86_64\"\n\t\t\n\textract_eos_android_libraries()\n\t\n\tenv.Append(LIBPATH=[eos_sdk_folder + \"Bin/Android/static-stdc++/libs/\" + eos_android_arch + \"/\"]) \n\tenv.Append(LIBS=[\"EOSSDK\"])\n\n\nif env[\"platform\"] == \"macos\":\n\tlibrary = env.SharedLibrary(\n\t\tf\"{plugin_bin_folder}/macos/{lib_name}.{platform}.{build_target}.framework/{lib_name}.{platform}.{build_target}\",\n\t\tsource=sources,)\nelse:\n\tlibrary = env.SharedLibrary(\n\t\tf\"{plugin_bin_folder}/{platform}/{lib_name}{env['suffix']}{env['SHLIBSUFFIX']}\",\n\t\tsource=sources,\n\t)\n\n\n# Disable scons cache for source files\n# NoCache(sources)\n\ncomplete_command = Command('complete', library, on_complete)\nDepends(complete_command, library)\nDefault(complete_command)"
  },
  {
    "path": "build-ios.sh",
    "content": "#!/bin/sh\n\nbuild=yes\nif [ \"$1\" = \"build=n\" ] || [ \"$1\" = \"build=N\" ] || [ \"$1\" = \"build=no\" ] || [ \"$1\" = \"build=0\" ]; then\n    build=no\nfi\n\ndev_build=no\ndev_build_ext=\"\"\nif [ \"$2\" = \"dev_build=y\" ] || [ \"$2\" = \"dev_build=Y\" ] || [ \"$2\" = \"dev_build=yes\" ] || [ \"$2\" = \"dev_build=1\" ]; then\n\tdev_build=yes\n\tdev_build_ext=\".dev\"\nfi\n\n\necho \"Config: dev_build=${dev_build}, build=${build}\"\n\n\nif [ \"$build\" = \"yes\" ]; then\n    echo \"\\nBuilding for iOS simulator template_debug target\"\n    scons arch=arm64 ios_simulator=yes platform=ios target=template_debug dev_build=${dev_build}\n\n    echo \"\\nBuilding for iOS device template_debug target\"\n    scons arch=arm64 ios_simulator=no platform=ios target=template_debug dev_build=${dev_build}\n\n    echo \"\\nBuilding for iOS simulator template_release target\"\n    scons arch=arm64 ios_simulator=yes platform=ios target=template_release dev_build=no\n    \n    echo \"\\nBuilding for iOS device template_release target\"\n    scons arch=arm64 ios_simulator=no platform=ios target=template_release dev_build=no\nfi\n\neosg_ios_bin_dir=./sample/addons/epic-online-services-godot/bin/ios\ngodotcpp_bin_dir=./godot-cpp/bin\n\necho \"\\nDeleting existing libgodot-cpp xcframework(s) if any\"\nrm -rf ${eosg_ios_bin_dir}/libgodot-cpp.ios.template*\n\necho \"\\nCreating libgodot-cpp xcframework for template_debug\"\nxcodebuild -create-xcframework \\\n-library ${godotcpp_bin_dir}/libgodot-cpp.ios.template_debug${dev_build_ext}.arm64.a \\\n-library ${godotcpp_bin_dir}/libgodot-cpp.ios.template_debug${dev_build_ext}.arm64.simulator.a \\\n-output ${eosg_ios_bin_dir}/libgodot-cpp.ios.template_debug.xcframework\n\necho \"\\nCreating libgodot-cpp xcframework for template_release\"\nxcodebuild -create-xcframework \\\n-library ${godotcpp_bin_dir}/libgodot-cpp.ios.template_release.arm64.a \\\n-library ${godotcpp_bin_dir}/libgodot-cpp.ios.template_release.arm64.simulator.a \\\n-output ${eosg_ios_bin_dir}/libgodot-cpp.ios.template_release.xcframework\n\necho \"\\nCreating libeosg xcframework for template_debug\"\nxcodebuild -create-xcframework \\\n-library ${eosg_ios_bin_dir}/libeosg.ios.template_debug${dev_build_ext}.arm64.dylib \\\n-library ${eosg_ios_bin_dir}/libeosg.ios.template_debug${dev_build_ext}.arm64.simulator.dylib \\\n-output ${eosg_ios_bin_dir}/libeosg.ios.template_debug.xcframework\n\necho \"\\nCreating libeosg xcframework for template_release\"\nxcodebuild -create-xcframework \\\n-library ${eosg_ios_bin_dir}/libeosg.ios.template_release.arm64.dylib \\\n-library ${eosg_ios_bin_dir}/libeosg.ios.template_release.arm64.simulator.dylib \\\n-output ${eosg_ios_bin_dir}/libeosg.ios.template_release.xcframework\n\n\necho \"\\nDeleting all .dylib files from eosg ios bin dir\"\nrm -rf ${eosg_ios_bin_dir}/*.dylib"
  },
  {
    "path": "debug-entitlements.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n    <key>com.apple.security.get-task-allow</key>\n    <true/>\n</dict>\n</plist>"
  },
  {
    "path": "debug.cmd",
    "content": "@echo off\nscons dev_build=yes && godot4 --path sample"
  },
  {
    "path": "debug.sh",
    "content": "scons dev_build=yes && godot45 --path sample"
  },
  {
    "path": "docs/.gitignore",
    "content": "# Dependencies\n/node_modules\n\n# Production\n/build\n\n# Generated files\n.docusaurus\n.cache-loader\n\n# Misc\n.DS_Store\n.env.local\n.env.development.local\n.env.test.local\n.env.production.local\n\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n"
  },
  {
    "path": "docs/README.md",
    "content": "# Website\n\nThis website is built using [Docusaurus](https://docusaurus.io/), a modern static website generator.\n\n### Installation\n\n```\n$ yarn\n```\n\n### Local Development\n\n```\n$ yarn start\n```\n\nThis command starts a local development server and opens up a browser window. Most changes are reflected live without having to restart the server.\n\n### Build\n\n```\n$ yarn build\n```\n\nThis command generates static content into the `build` directory and can be served using any static contents hosting service.\n\n### Deployment\n\nUsing SSH:\n\n```\n$ USE_SSH=true yarn deploy\n```\n\nNot using SSH:\n\n```\n$ GIT_USER=<Your GitHub username> yarn deploy\n```\n\nIf you are using GitHub pages for hosting, this command is a convenient way to build the website and push to the `gh-pages` branch.\n"
  },
  {
    "path": "docs/docs/installation.md",
    "content": "# Installation\n\n## Method 1: Install from Asset Library (Recommended)\n\n[View the plugin on Godot Asset Library](https://godotengine.org/asset-library/asset/2453)\n\n1. In the Godot editor, navigate to the `AssetLib` tab at the top, and in the search bar type `EOSG`.\n2. Click on the plugin with name `Epic Online Services Godot (EOSG)` by `3ddelano`\n3. In the popup that opens, click the `Download` button.\n4. Once the download is done, click the `Install` button.\n5. Goto `Project -> Project Settings -> Plugins` and enable the `Epic Online Services Godot 4.2+ (EOSG)` plugin.\n6. **Restart the godot editor.**\n7. The plugin is now installeed. Check out the [Initialization](/docs/topics/initialization) guide next.\n\n## Method 2: Install from GitHub\n\n1. Goto the [Releases](https://github.com/3ddelano/epic-online-services-godot/releases) section and download the latest release. Here there are separate zip files for each platform which you can download if you are only looking to release on one platform or download the `epic-online-services-godot-all` that supports all platforms.\n2. Extract the zip file and copy the `addons/epic-online-services-godot` folder into the `res://addons/` folder of your project. If the `res://addons` does not exist, create it.\n3. In the Godot editor, goto `Project -> Project Settings -> Plugins` and enable the `Epic Online Services Godot 4.2+ (EOSG)` plugin.\n4. **Restart the godot editor.**\n5. The plugin is now installeed. Check out the [Initialization](/docs/topics/initialization) guide next."
  },
  {
    "path": "docs/docs/introduction.md",
    "content": "# Introduction\n\nEpic Online Services Godot (EOSG) is the easiest way to integrate Epic Online Services into your Godot project.\n\nThe plugin supports the following platforms:\n\n- Windows x64\n- Linux x64/arm64\n- Android x64/arm64\n- MacOS universal\n- iOS arm64 (iPhone/simulator)\n\nThis plugin has two main ways in which you can interact with Epic Online Services:\n\n1. High Level EOS (Recommended)\n2. GDExtension EOS\n\n\n### High Level EOS (Recommended)\n\nThe High Level Epic Online Services provides easy-to-use methods and signals to interact with EOS, making it ideal for beginners. This simplified API abstracts away many of the complexities of the EOS SDK while providing access to its core functionality.\n\n\n### GDExtension EOS\n\nThe GDExtension EOS provides low-level access to the Epic Online Services SDK. This interface is not recommended for beginners but gives you full access to the underlying EOS functionality through the `EOS` and `IEOS` classes in Godot.\n\n<br></br>\n\nHere's the next steps;\n\n- To get started with using the plugin, check out the [Installation](/docs/installation) guide.\n- Checkout the [Games Showcase](/showcase)"
  },
  {
    "path": "docs/docs/sample-project.md",
    "content": "# Sample Project\n\nTo run the sample project which showcases most of the EOS features, follow these steps:\n\n1. Clone/Download the [plugin repo](https://github.com/3ddelano/epic-online-services-godot)\n\n2. You cannot directly open the ./sample folder and run the project, because the plugin binaries are not included. To include the plugin binaries. Download the [latest release](https://github.com/3ddelano/epic-online-services-godot/releases/latest) from the Releases section and replace the existing `sample/addons/epic-online-services-godot` folder with the one from the Release (this includes the built shared libraries). See the [Installation](/docs/installation) section for more information on how to install the plugin.\n\n3. Copy your credentials (`Product Id`, `Sandbox Id`, `Deployment Id`, `Client Id`, `Client Secret`) of your Epic Games \"Product\" from the Epic Games Dev Portal and paste them in `./sample/Main.gd` script in the relevant sections. The encryption key is a random 64 character long string. These credentials need to be kept as private as possible. One way is to make sure to encrypt all scripts when exporting the final game. (See [Compiling with script key encryption](https://docs.godotengine.org/en/stable/development/compiling/compiling_with_script_encryption_key.html))\n\n4. Configure your Product on the [EOS Dev Portal](https://dev.epicgames.com/portal) with the following configuration:\n  - In the `Client Policies` section in `Product Settings`, for the Client policy type choose `Custom policy`, enable the `User is required` and enable every features and action except `Connect` (Trusted Server Required). This will allow the sample to access the different services provided by Epic Online Services. In your actual game, the client policy is important and you should give minimal permissions to features.\n  - In the `Permissions` section of `Epic Account Services`, enable all three: `Basic Profile`, `Online Presence` and `Friends`. \n  - (Optional if you want some pre-made achievements)\n  In the `Achievements` section in `Game Services`, use the `Bulk Import` option and import the `HelloProduct.zip` file located at `res://HelloProduct.zip`\n\n5. Finally open the `./sample` folder in Godot."
  },
  {
    "path": "docs/docs/topics/authentication.md",
    "content": "# Authentication\n\nWIP - Work In Progress"
  },
  {
    "path": "docs/docs/topics/initialization.md",
    "content": "import ReactPlayer from 'react-player'\n\n# Initialization\n\nFollow the steps below to initialize and use the plugin.\n\nCheck out the below video for a quick walkthrough.\n\n<ReactPlayer controls url='https://www.youtube.com/watch?v=ENyvF4yVjKg' />\n\n<br></br>\n\n1. You will need the following from the EOS Developer Portal:\n- `PRODUCT_ID`\n- `SANDBOX_ID`\n- `DEPLOYMENT_ID`\n- `CLIENT_ID`\n- `CLIENT_SECRET`\n\n2. You also need to provide these values yourself:\n- `PRODUCT_NAME` - A name chosen by you for the project\n- `PRODUCT_VERSION` - A version chosen by you for the project\n- `ENCRYPTION_KEY` - A random 64 character long string\n\nNow at the start of your game, or when you want to initialize EOS. Use the following script:\n\n```gdscript\nextends Node\n\nfunc _ready() -> void:\n\t# This will control which logs you get from EOSG\n\tHLog.log_level = HLog.LogLevel.INFO\n\n\tvar init_opts = EOS.Platform.InitializeOptions.new()\n\tinit_opts.product_name = \"PRODUCT_NAME_HERE\" # Change this\n\tinit_opts.product_version = \"PRODUCT_VERSION_HERE\" # Change this\n\n\tvar create_opts = EOS.Platform.CreateOptions.new()\n\tcreate_opts.product_id = \"PRODUCT_ID_HERE\" # Change this\n\tcreate_opts.sandbox_id = \"SANDBOX_ID_HERE\" # Change this\n\tcreate_opts.deployment_id = \"DEPLOYMENT_ID_HERE\" # Change this\n\tcreate_opts.client_id = \"CLIENT_ID_HERE\" # Change this\n\tcreate_opts.client_secret = \"CLIENT_SECRET_HERE\" # Change this\n\tcreate_opts.encryption_key = \"ENCRYPTION_KEY_HERE\" # Change this\n\n\t# Enable Social Overlay on Windows\n\tif OS.get_name() == \"Windows\":\n\t\tHAuth.auth_login_flags = EOS.Auth.LoginFlags.None\n\t\tcreate_opts.flags = EOS.Platform.PlatformFlags.WindowsEnableOverlayOpengl\n\n\t# Initialize the SDK\n\tvar init_res := await HPlatform.initialize_async(init_opts)\n\tif not EOS.is_success(init_res):\n\t\tprinterr(\"Failed to initialize EOS SDK: \", EOS.result_str(init_res))\n\t\treturn\n\t\n\t# Create platform\n\tvar create_success := await HPlatform.create_platform_async(create_opts)\n\tif not create_success:\n\t\tprinterr(\"Failed to create EOS Platform\")\n\t\treturn\n\n\t# Setup Logs from EOS\n\tHPlatform.log_msg.connect(_on_eos_log_msg)\n\t# This will control which logs you get from EOS SDK\n\tvar log_res := HPlatform.set_eos_log_level(EOS.Logging.LogCategory.AllCategories, EOS.Logging.LogLevel.Info)\n\tif not EOS.is_success(log_res):\n\t\tprinterr(\"Failed to set logging level\")\n\t\treturn\n\n\tHAuth.logged_in.connect(_on_logged_in)\n\n\t# During development use the devauth tool to login\n\tHAuth.login_devtool_async(\"localhost:4545\", \"CREDENTIAL_NAME_HERE\")\n\n\t# Only on mobile device (Login without any credentials)\n\t# await HAuth.login_anonymous_async()\n\n\nfunc _on_logged_in():\n\tprint(\"Logged in successfully: product_user_id=%s\" % HAuth.product_user_id)\n\n# This method is called when we get a log message from EOS SDK\nfunc _on_eos_log_msg(msg: EOS.Logging.LogMessage) -> void:\n\tprint(\"SDK %s | %s\" % [msg.category, msg.message])\n```\n\n## Initialization on Windows\n\nTo use the `Account Portal` login option on Windows, you need to bootstrap Godot with EOS. See the steps below.\n\n### Bootstrapping Godot with EOS for Windows\n\nFollow the tutorial at [Redistributable Installer](https://dev.epicgames.com/docs/services/en-US/EpicAccountServices/Crossplayacrossplatforms/RedistributableInstaller/index.html) and also see the below steps.\n\nA sample of the generated `.ini` file for the Godot Editor is shown below (during game development):\n```\nApplicationPath=APPLICATION_PATH_HERE\nWorkingDirectory=\nWaitForExit=0\nNoOperation=0\n```\n\nIn the above `.ini` file, the `APPLICATION_PATH_HERE` can either be the path to your Godot Editor executable (Eg. `Godot_v4.2.0-stable_win64.exe`) when you are in development or the path to the exported game (Eg. `MyAmazingGame.exe`)\n\n## Initialization on Android\n\nThe plugin supports the Android platform, but needs a few one-time steps to initialize and configure android exports.\n\n### Pre-requisites\n\n1. Setup the `Android Build Template` in your Godot project by following the tutorial [Gradle builds for Andriod](https://docs.godotengine.org/en/stable/tutorials/export/android_gradle_build.html). This will create an android project in `res://android/build`.\n\n2. Now with reference to the tutorial [Add the EOS SDK to Your Android Studio Project](https://dev.epicgames.com/docs/epic-online-services/platforms/android#4-add-the-eos-sdk-to-your-android-studio-project), perform the following steps.\n\n3. In the `res://android/build/build.gradle` file, add the following lines after the implementations in the `dependencies` section.\n\n    ```gradle\n    dependencies {\n        implementation libraries.kotlinStdLib\n        implementation libraries.androidxFragment\n        \n        // highlight-start\n        // Add these lines\n        // EOS SDK dependencies\n        implementation 'androidx.appcompat:appcompat:1.5.1'\n        implementation 'androidx.constraintlayout:constraintlayout:2.1.4'\n        implementation 'androidx.security:security-crypto:1.0.0'\n        implementation 'androidx.browser:browser:1.4.0'\n        // Update the path so that it points to eossdk-StaticSTDC-release.aar provided in addons/epic-online-services-godot/bin/android/\n        implementation files('../../addons/epic-online-services-godot/bin/android/eossdk-StaticSTDC-release.aar')\n        // highlight-end\n\n        ...other code\n    ```\n\n4. In the `res://android/build/build.gradle` file, add the following lines after the `defaultConfig` in the `android` section.\n\n    ```gradle\n    android {\n\n        ... other code\n\n        defaultConfig {\n            ... other code\n        \n            // Feel free to modify the application id to your own.\n            applicationId getExportPackageName()\n            versionCode getExportVersionCode()\n            versionName getExportVersionName()\n            minSdkVersion getExportMinSdkVersion()\n            targetSdkVersion getExportTargetSdkVersion()\n\n            missingDimensionStrategy 'products', 'template'\n\n            // highlight-start\n            // Add these lines\n            // This is needed by EOS Android SDK\n            String ClientId = \"PUT YOUR EOS CLIENT_ID HERE\"\n            resValue(\"string\", \"eos_login_protocol_scheme\", \"eos.\" + ClientId.toLowerCase())\n            // highlight-end\n        }\n\n        ... other code\n    ```\n\n5. In the `res://android/build/config.gradle` file, update the `minSdk` to `23` to match with the requirements of the `EOS Android SDK`.\n\n    Before\n    ```gradle\n    minSdk             : 21,\n    ```\n    After\n    ```gradle\n    minSdk             : 23,\n    ```\n\n6. In the `res://android/build/src/com/godot/game/GodotGame.java` file, update it as follows.\n    ```java\n    package com.godot.game;\n\n    // highlight-next-line\n    import com.epicgames.mobile.eossdk.EOSSDK;     // added\n    import org.godotengine.godot.GodotActivity;\n\n    import android.os.Bundle;\n\n    public class GodotApp extends GodotActivity {\n        // highlight-next-line\n        static {                                   // added\n            // highlight-next-line\n            System.loadLibrary(\"EOSSDK\");          // added\n        // highlight-next-line\n        }                                          // added\n        \n        @Override\n        public void onCreate(Bundle savedInstanceState) {\n            EOSSDK.init(getActivity());  // added\n            \n            setTheme(R.style.GodotAppMainTheme);\n            super.onCreate(savedInstanceState);\n\n        }\n    }\n\n    ```\n\n7. Now open your project in the Godot Editor, and goto `Project -> Export` and create a new Android export profile.\n\n8. In the `Gradle Build` section, enable `Use Gradle Build`. In the `Architectures` section enable `arm64-v8a`. In the `Permissions` section ensure that `ACESSS_NETWORK_STATE`, `ACCESS_WIFI_STATE` and `INTERNET` are enabled. These permissions are needed for the EOS SDK to work. Fill in the other details such as package name, etc as needed.\n\n9. You can now export the Android APK by clicking the `Export Project` button.\n\n\n## Initialization on iOS\n\nExport the project from Godot editor for iOS target. **You might get a build error during this process, ignore it.** Open the generated iOS project in XCode and build the project. The build should be successful. EOSG has support for `iOS arm64 device` and `iOS arm64 simulator`.\n"
  },
  {
    "path": "docs/docs/update-guide.md",
    "content": "# Update Guide\n\nFollow these steps to update to a newer version of the plugin:\n\n1. Disable the plugin in the Editor in `Project -> Project Setings -> Plugins`.\n2. Delete the `res://addons/epic-online-services-godot` folder.\n3. Now you can install the newer version using any of the methods described in [Installation](/docs/installation) section\n4. After installing, enable the plugin and restart the Editor."
  },
  {
    "path": "docs/docusaurus.config.ts",
    "content": "import { themes as prismThemes } from \"prism-react-renderer\";\nimport type { Config } from \"@docusaurus/types\";\nimport type * as Preset from \"@docusaurus/preset-classic\";\n\n// This runs in Node.js - Don't use client-side code here (browser APIs, JSX...)\n\nconst config: Config = {\n  title: \"Epic Online Services Godot\",\n  tagline: \"Easiest way to use Epic Online Services in Godot 4.2+\",\n  favicon: \"img/favicon.ico\",\n\n  url: \"https://3ddelano.github.io\",\n  baseUrl: \"/epic-online-services-godot/\",\n\n  // GitHub pages deployment config\n  organizationName: \"3ddelano\",\n  projectName: \"epic-online-services-godot\",\n  deploymentBranch: \"gh-pages\",\n\n  trailingSlash: false,\n\n  onBrokenLinks: \"throw\",\n  onBrokenMarkdownLinks: \"warn\",\n\n  i18n: {\n    defaultLocale: \"en\",\n    locales: [\"en\"],\n  },\n\n  presets: [\n    [\n      \"classic\",\n      {\n        docs: {\n          sidebarPath: \"./sidebars.ts\",\n          editUrl:\n            \"https://github.com/3ddelano/epic-online-services-godot/tree/main/docs\",\n        },\n        theme: {\n          customCss: \"./src/css/custom.css\",\n        },\n      } satisfies Preset.Options,\n    ],\n  ],\n\n  themeConfig: {\n    colorMode: {\n      defaultMode: \"dark\",\n      disableSwitch: true,\n      respectPrefersColorScheme: false,\n    },\n    image: \"img/og-image.jpg\",\n    navbar: {\n      title: \"Epic Online Services Godot\",\n      logo: {\n        alt: \"EOSG Logo\",\n        src: \"img/eosg-logo.svg\",\n      },\n      items: [\n        {\n          type: \"docSidebar\",\n          sidebarId: \"docsSidebar\",\n          position: \"left\",\n          label: \"Docs\",\n        },\n        {\n          to: \"showcase\",\n          position: \"left\",\n          label: \"Showcase\",\n        },\n        {\n          href: \"https://github.com/3ddelano/epic-online-services-godot\",\n          label: \"GitHub\",\n          position: \"right\",\n        },\n      ],\n    },\n    footer: {\n      style: \"dark\",\n      links: [\n        {\n          title: \"Docs\",\n          items: [\n            {\n              label: \"Docs\",\n              to: \"/docs/introduction\",\n            },\n          ],\n        },\n        {\n          title: \"Community\",\n          items: [\n            {\n              label: \"Discord\",\n              href: \"https://discord.gg/FZY9TqW\",\n            },\n          ],\n        },\n        {\n          title: \"More\",\n          items: [\n            {\n              label: \"GitHub\",\n              href: \"https://github.com/facebook/docusaurus\",\n            },\n            {\n              label: \"Sponsor\",\n              href: \"https://github.com/sponsors/3ddelano\",\n            },\n          ],\n        },\n      ],\n      copyright: `Copyright © ${new Date().getFullYear()} Delano Lourenco`,\n    },\n    prism: {\n      theme: prismThemes.github,\n      darkTheme: prismThemes.dracula,\n      additionalLanguages: [\"gdscript\", \"gradle\", \"java\"],\n    },\n  } satisfies Preset.ThemeConfig,\n\n  plugins: [\"./src/plugins/tailwind-config.ts\"],\n};\n\nexport default config;\n"
  },
  {
    "path": "docs/package.json",
    "content": "{\n  \"name\": \"docs\",\n  \"version\": \"0.0.0\",\n  \"private\": true,\n  \"scripts\": {\n    \"docusaurus\": \"docusaurus\",\n    \"start\": \"docusaurus start\",\n    \"dev\": \"docusaurus start\",\n    \"build\": \"docusaurus build\",\n    \"swizzle\": \"docusaurus swizzle\",\n    \"deploy\": \"docusaurus deploy\",\n    \"clear\": \"docusaurus clear\",\n    \"serve\": \"docusaurus serve\",\n    \"write-translations\": \"docusaurus write-translations\",\n    \"write-heading-ids\": \"docusaurus write-heading-ids\",\n    \"typecheck\": \"tsc\"\n  },\n  \"dependencies\": {\n    \"@docusaurus/core\": \"^3.9.2\",\n    \"@docusaurus/preset-classic\": \"^3.9.2\",\n    \"@mdx-js/react\": \"^3.0.0\",\n    \"baseline-browser-mapping\": \"^2.9.19\",\n    \"caniuse-lite\": \"^1.0.30001769\",\n    \"clsx\": \"^2.0.0\",\n    \"prism-react-renderer\": \"^2.3.0\",\n    \"react\": \"^19.0.0\",\n    \"react-dom\": \"^19.0.0\",\n    \"react-player\": \"^2.16.0\"\n  },\n  \"devDependencies\": {\n    \"@docusaurus/module-type-aliases\": \"^3.9.2\",\n    \"@docusaurus/tsconfig\": \"^3.9.2\",\n    \"@docusaurus/types\": \"^3.9.2\",\n    \"@tailwindcss/postcss\": \"^4.1.3\",\n    \"postcss\": \"^8.5.3\",\n    \"tailwindcss\": \"^4.1.3\",\n    \"typescript\": \"~5.6.2\"\n  },\n  \"browserslist\": {\n    \"production\": [\n      \">0.5%\",\n      \"not dead\",\n      \"not op_mini all\"\n    ],\n    \"development\": [\n      \"last 3 chrome version\",\n      \"last 3 firefox version\",\n      \"last 5 safari version\"\n    ]\n  },\n  \"engines\": {\n    \"node\": \">=18.0\"\n  }\n}\n"
  },
  {
    "path": "docs/postcss.config.js",
    "content": "module.exports = {\n\tplugins: {\n\t\t'@tailwindcss/postcss': {},\n\t}\n}"
  },
  {
    "path": "docs/sidebars.ts",
    "content": "import type { SidebarsConfig } from '@docusaurus/plugin-content-docs';\n\n// This runs in Node.js - Don't use client-side code here (browser APIs, JSX...)\n\n/**\n * Creating a sidebar enables you to:\n - create an ordered group of docs\n - render a sidebar for each doc of that group\n - provide next/previous navigation\n\n The sidebars can be generated from the filesystem, or explicitly defined here.\n\n Create as many sidebars as you want.\n */\nconst sidebars: SidebarsConfig = {\n  // By default, Docusaurus generates a sidebar from the docs folder structure\n  // docsSidebar: [{type: 'autogenerated', dirName: '.'}],\n\n  // But you can create a sidebar manually\n  docsSidebar: [\n    'introduction',\n    'installation',\n    'update-guide',\n    'sample-project',\n    {\n      type: 'category',\n      label: 'Topics',\n      items: ['topics/initialization', 'topics/authentication'],\n      collapsed: false\n    },\n  ],\n};\n\nexport default sidebars;\n"
  },
  {
    "path": "docs/src/components/ExampleSection.tsx",
    "content": "import CodeBlock from \"@theme/CodeBlock\";\n\nconst codeExample = `\n# In main script\nextends Node\n\nfunc _ready() -> void:\n    # Setup HEOS Logs\n    HLog.log_level = HLog.LogLevel.INFO\n\n    var init_opts = EOS.Platform.InitializeOptions.new()\n    init_opts.product_name = \"PRODUCT_NAME_HERE\"\n    init_opts.product_version = \"PRODUCT_VERSION_HERE\"\n\n    var create_opts = EOS.Platform.CreateOptions.new()\n    create_opts.product_id = \"PRODUCT_ID_HERE\"\n    create_opts.sandbox_id = \"SANDBOX_ID_HERE\"\n    create_opts.deployment_id = \"DEPLOYMENT_ID_HERE\"\n    create_opts.client_id = \"CLIENT_ID_HERE\"\n    create_opts.client_secret = \"CLIENT_SECRET_HERE\"\n    create_opts.encryption_key = \"ENCRYPTION_KEY_HERE\"\n\n    # Enable Social Overlay on Windows\n    if OS.get_name() == \"Windows\":\n        HAuth.auth_login_flags = EOS.Auth.LoginFlags.None\n        create_opts.flags = EOS.Platform.PlatformFlags.WindowsEnableOverlayOpengl\n\n    # Initialize the SDK\n    var init_res := await HPlatform.initialize_async(init_opts)\n    if not EOS.is_success(init_res):\n        printerr(\"Failed to initialize EOS SDK: \", EOS.result_str(init_res))\n        return\n\n    # Create platform\n    var create_success := await HPlatform.create_platform_async(create_opts)\n    if not create_success:\n        printerr(\"Failed to create EOS Platform\")\n        return\n\n    # Setup Logs from EOS\n    HPlatform.log_msg.connect(_on_eos_log_msg)\n    var log_res := HPlatform.set_eos_log_level(EOS.Logging.LogCategory.AllCategories, EOS.Logging.LogLevel.Info)\n    if not EOS.is_success(log_res):\n        printerr(\"Failed to set logging level\")\n        return\n\n    HAuth.logged_in.connect(_on_logged_in)\n\n    # During development use the devauth tool to login\n    HAuth.login_devtool_async(\"localhost:4545\", \"CREDENTIAL_NAME_HERE\")\n\n    # Only on mobile device (Login without any credentials)\n    # await HAuth.login_anonymous_async()\n\n\nfunc _on_logged_in():\n    print(\"Logged in successfully: product_user_id=%s\" % HAuth.product_user_id)\n\n    # Example: Get top records for a leaderboard\n    var records := await HLeaderboards.get_leaderboard_records_async(\"LEADERBOARD_ID_HERE\")\n    print(records)\n\n\nfunc _on_eos_log_msg(msg: EOS.Logging.LogMessage) -> void:\n    print(\"SDK %s | %s\" % [msg.category, msg.message])\n`;\n\nexport function ExampleSection() {\n  return (\n    <section id=\"example\" className=\"py-16 sm:py-20 bg-gray-900\">\n      <div className=\"container mx-auto px-6\">\n        <h2 className=\"text-3xl font-bold mb-8 text-center text-white\">\n          Basic Usage Example (GDScript)\n        </h2>\n        <div className=\"max-w-4xl mx-auto\">\n          <CodeBlock language=\"gdscript\">{codeExample}</CodeBlock>\n        </div>\n      </div>\n    </section>\n  );\n}\n"
  },
  {
    "path": "docs/src/components/FeaturesSection.tsx",
    "content": "const FEATURES = [\n  \"Authentication\",\n  \"Social Overlay (Win)\",\n  \"Achievements\",\n  \"Stats & Leaderboards\",\n  \"Lobby & Sessions\",\n  \"Multiplayer (P2P)\",\n  \"Voice\",\n  \"Metrics\",\n  \"Mods\",\n  \"Player/Title Storage\",\n  \"Progression Snapshot\",\n  \"Reports & Sanctions\",\n  \"Ecommerce (EGS)\",\n  \"AntiCheat\",\n];\n\nconst HIGH_LEVEL_CLASSES = [\n  \"HPlatform\",\n  \"HAuth\",\n  \"HAchievements\",\n  \"HFriends\",\n  \"HStats\",\n  \"HLeaderboards\",\n  \"HLobbies\",\n  \"HP2P\",\n  \"HLog\",\n];\n\nexport function FeaturesSection() {\n  return (\n    <section id=\"features\" className=\"py-20 sm:py-24 bg-[#0a0f1e]\">\n      <div className=\"container mx-auto px-6\">\n        <h2 className=\"text-3xl font-bold mb-4 text-center text-white tracking-tight\">\n          Core Features\n        </h2>\n        <p className=\"text-gray-400 text-center mb-14 max-w-2xl mx-auto font-light\">\n          All the EOS features you need, wrapped in a clean GDScript API.\n        </p>\n        <div className=\"grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 gap-3 max-w-6xl mx-auto\">\n          {FEATURES.map((feature, index) => (\n            <div key={index} className=\"feature-card p-4 rounded-xl\">\n              <span className=\"flex items-center text-sm\">\n                <svg\n                  className=\"w-4 h-4 mr-2 text-emerald-400 flex-shrink-0\"\n                  fill=\"currentColor\"\n                  viewBox=\"0 0 20 20\"\n                >\n                  <path\n                    fillRule=\"evenodd\"\n                    d=\"M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z\"\n                    clipRule=\"evenodd\"\n                  ></path>\n                </svg>\n                <span className=\"text-gray-200 font-medium\">{feature}</span>\n              </span>\n            </div>\n          ))}\n        </div>\n      </div>\n    </section>\n  );\n}\n\nexport function HighLevelSection() {\n  return (\n    <section id=\"high-level\" className=\"py-16 sm:py-20 bg-gray-950\">\n      <div className=\"container mx-auto px-6\">\n        <h2 className=\"text-3xl font-bold mb-10 text-center text-white\">\n          High Level EOS Classes\n        </h2>\n        <p className=\"text-gray-300 mb-8 max-w-2xl mx-auto text-center\">\n          These classes simplify interaction with EOS services. They include\n          built-in documentation accessible directly within the Godot Editor.\n        </p>\n        <div className=\"grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 gap-4 max-w-5xl mx-auto\">\n          {HIGH_LEVEL_CLASSES.map((cls, index) => (\n            <div\n              key={index}\n              className=\"bg-blue-900/80 hover:bg-blue-800/80 p-4 rounded-lg text-center shadow transition\"\n            >\n              <span className=\"font-mono font-medium text-blue-100\">{cls}</span>\n            </div>\n          ))}\n        </div>\n      </div>\n    </section>\n  );\n}\n"
  },
  {
    "path": "docs/src/components/HeroSection.tsx",
    "content": "import useDocusaurusContext from \"@docusaurus/useDocusaurusContext\";\nimport { GodotIcon, EpicIcon } from \"../components/Icons\";\n\nconst VERSIONS = [\n  { label: \"Godot\", value: \"4.2+\", icon: GodotIcon },\n  { label: \"EOS SDK\", value: \"1.18.1.2\", icon: EpicIcon },\n];\n\nconst PLATFORMS = [\n  { label: \"Windows x64/arm64\", icon: \"🖥️\" },\n  { label: \"Linux x64/arm64\", icon: \"🐧\" },\n  { label: \"Android x64/arm64\", icon: \"🤖\" },\n  { label: \"MacOS x64/arm64\", icon: \"🍎\" },\n  { label: \"iOS arm64\", icon: \"🍏\" },\n];\n\nconst HERO_ACTIONS = [\n  {\n    label: \"Download Latest\",\n    href: \"https://github.com/3ddelano/epic-online-services-godot/releases/latest\",\n    primary: true,\n    target: \"_blank\",\n  },\n  {\n    label: \"Documentation\",\n    href: \"docs/introduction\",\n    primary: false,\n  },\n];\n\nexport function HeroSection() {\n  const { siteConfig } = useDocusaurusContext();\n  return (\n    <section\n      id=\"hero\"\n      className=\"relative bg-[#030712] py-28 sm:py-36 overflow-hidden\"\n    >\n      <div className=\"absolute inset-0 hero-image opacity-30\"></div>\n      {/* Glow orbs */}\n      <div className=\"absolute top-20 left-1/4 w-96 h-96 bg-blue-600/20 rounded-full blur-[120px]\"></div>\n      <div className=\"absolute bottom-20 right-1/4 w-80 h-80 bg-purple-600/15 rounded-full blur-[100px]\"></div>\n\n      <div className=\"container px-6 relative z-10 grid lg:grid-cols-2 gap-12 items-center\">\n        {/* Left col */}\n        <div className=\"max-w-xl\">\n          <h1 className=\"text-4xl font-bold tracking-tight sm:text-5xl md:text-6xl mb-6 text-white leading-tight\">\n            {siteConfig.title}\n          </h1>\n          <p className=\"text-xl text-gray-400 mb-8 font-light leading-relaxed\">\n            {siteConfig.tagline}\n          </p>\n          <div className=\"flex flex-wrap gap-3 mb-8\">\n            {VERSIONS.map((v, i) => (\n              <span\n                key={i}\n                className=\"glass px-4 py-2 rounded-full flex items-center text-sm font-semibold text-gray-200\"\n              >\n                <v.icon className=\"w-4 h-4 mr-2\" />\n                {v.label} {v.value}\n              </span>\n            ))}\n          </div>\n\n          <div className=\"flex flex-wrap gap-4 mb-10\">\n            {HERO_ACTIONS.map((action, i) => (\n              <a\n                key={i}\n                href={action.href}\n                target={action.target}\n                rel={action.target === \"_blank\" ? \"noopener noreferrer\" : \"\"}\n                className={`${\n                  action.primary ? \"button-primary\" : \"button-secondary\"\n                } px-7 py-3.5 rounded-xl text-sm font-bold uppercase tracking-wider no-underline`}\n              >\n                {action.label}\n              </a>\n            ))}\n          </div>\n\n          <div className=\"text-gray-500\">\n            <p className=\"mb-3 font-semibold text-gray-400 text-sm uppercase tracking-wider\">\n              Supported Platforms\n            </p>\n            <div className=\"flex flex-wrap gap-2\">\n              {PLATFORMS.map((platform, i) => (\n                <span\n                  key={i}\n                  className=\"glass px-3 py-1.5 rounded-full text-xs font-semibold text-gray-300 transition-transform duration-200 hover:scale-105\"\n                >\n                  {platform.icon} {platform.label}\n                </span>\n              ))}\n            </div>\n          </div>\n        </div>\n\n        {/* Logo Column */}\n        <div className=\"flex-1 flex justify-center items-center\">\n          <div className=\"relative\">\n            <div className=\"absolute inset-0 bg-blue-500/20 rounded-full blur-[60px] scale-110\"></div>\n            <img\n              src=\"img/eosg-logo.svg\"\n              alt=\"Logo\"\n              className=\"w-64 h-64 object-contain rounded-md relative z-10 drop-shadow-2xl\"\n            />\n          </div>\n        </div>\n      </div>\n    </section>\n  );\n}\n"
  },
  {
    "path": "docs/src/components/Icons.tsx",
    "content": "export function GodotIcon({ className = \"w-4 h-4\" }) {\n  return (\n    <svg\n      xmlns=\"http://www.w3.org/2000/svg\"\n      className={className}\n      viewBox=\"0 0 1024 1024\"\n    >\n      <g fill=\"#fff\">\n        <path d=\"M417.615 76.875c-42.392 9.424-84.326 22.545-123.642 42.334.899 34.716 3.143 67.98 7.693 101.768-15.268 9.782-31.315 18.177-45.576 29.628-14.49 11.148-29.29 21.813-42.41 34.85-26.212-17.337-53.955-33.63-82.535-48.012C100.337 270.6 71.53 306.383 48 346.428c18.493 29.029 38.33 58.205 56.7 80.959v245.765c.449.005.898.021 1.343.063l150.67 14.527a16.22 16.22 0 0 1 14.627 15.024l4.646 66.51 131.43 9.378 9.055-61.386a16.22 16.22 0 0 1 16.05-13.858h158.961c8.047 0 14.873 5.899 16.047 13.858l9.055 61.386 131.434-9.379 4.642-66.51a16.23 16.23 0 0 1 14.627-15.023l150.611-14.527c.446-.042.89-.058 1.34-.063v-19.611l.063-.02V427.387c21.216-26.71 41.307-56.172 56.699-80.96-23.523-40.044-52.345-75.828-83.152-108.984-28.573 14.382-56.325 30.675-82.537 48.012-13.117-13.037-27.89-23.702-42.4-34.85-14.258-11.45-30.324-19.846-45.563-29.628 4.537-33.788 6.78-67.052 7.683-101.768-39.32-19.79-81.249-32.91-123.662-42.334-16.933 28.46-32.42 59.28-45.906 89.408-15.993-2.672-32.06-3.662-48.149-3.853v-.026c-.112 0-.216.026-.312.026-.1 0-.205-.026-.305-.026v.026c-16.117.191-32.17 1.18-48.168 3.853-13.478-30.129-28.955-60.948-45.914-89.408M298.416 436.398c50.151 0 90.799 40.618 90.799 90.752 0 50.168-40.648 90.809-90.799 90.809-50.126 0-90.787-40.64-90.787-90.809 0-50.134 40.66-90.752 90.787-90.752m427.178 0c50.122 0 90.779 40.618 90.779 90.752 0 50.168-40.657 90.809-90.78 90.809-50.159 0-90.806-40.64-90.806-90.809 0-50.134 40.647-90.752 90.807-90.752m-213.6 53.11c16.143 0 29.254 11.908 29.254 26.56v83.59c0 14.665-13.111 26.563-29.254 26.563-16.142 0-29.226-11.898-29.226-26.563v-83.59c0-14.652 13.084-26.56 29.226-26.56\"></path>\n        <path d=\"m784.071 718.723-4.666 66.864c-.562 8.059-6.972 14.474-15.031 15.052l-160.49 11.451q-.587.043-1.17.042c-7.975 0-14.856-5.853-16.034-13.861l-9.203-62.415H446.525l-9.203 62.415c-1.237 8.4-8.746 14.44-17.204 13.82l-160.49-11.452c-8.059-.578-14.469-6.993-15.03-15.052l-4.667-66.864-135.48-13.062c.062 14.56.249 30.512.249 33.688 0 143.085 181.51 211.86 407.024 212.651h.554c225.514-.79 406.962-69.566 406.962-212.651 0-3.234.195-19.119.262-33.688zM367.367 532.537c0 33.276-26.97 60.246-60.27 60.246-33.285 0-60.271-26.97-60.271-60.246s26.986-60.27 60.27-60.27c33.301 0 60.27 26.994 60.27 60.27M656.64 532.537c0 33.276 26.962 60.246 60.238 60.246 33.309 0 60.27-26.97 60.27-60.246s-26.961-60.27-60.27-60.27c-33.276 0-60.237 26.994-60.237 60.27\"></path>\n      </g>\n    </svg>\n  );\n}\n\nexport function EpicIcon({ className = \"w-4 h-4\" }) {\n  return (\n    <svg\n      xmlns=\"http://www.w3.org/2000/svg\"\n      xmlSpace=\"preserve\"\n      className={className}\n      version=\"1.1\"\n      viewBox=\"0 0 647.167 750.977\"\n    >\n      <defs>\n        <clipPath id=\"a\" clipPathUnits=\"userSpaceOnUse\">\n          <path d=\"M0 790.889h900V0H0Z\"></path>\n        </clipPath>\n      </defs>\n      <g transform=\"matrix(1.33333 0 0 -1.33333 -278.052 902.583)\">\n        <g>\n          <g clipPath=\"url(#a)\">\n            <g transform=\"translate(649.836 676.938)\">\n              <path\n                fill=\"#2f2d2e\"\n                fillOpacity=\"1\"\n                fillRule=\"evenodd\"\n                stroke=\"none\"\n                d=\"M0 0h-397.219c-32.196 0-44.078-11.882-44.078-44.093v-388.676c0-3.645.147-7.031.469-10.168.733-7.031.871-13.844 7.41-21.601.639-.76 7.315-5.728 7.315-5.728 3.591-1.761 6.043-3.058 10.093-4.688l195.596-81.948c10.154-4.655 14.4-6.469 21.775-6.323v-.001h.058v.001c7.375-.146 11.621 1.668 21.776 6.323L18.79-474.954c4.051 1.63 6.502 2.927 10.094 4.688 0 0 6.676 4.968 7.314 5.728 6.539 7.757 6.677 14.57 7.41 21.601.322 3.137.47 6.523.47 10.168v388.676C44.078-11.882 32.195 0 0 0\"\n              ></path>\n            </g>\n            <g transform=\"translate(623.23 286.175)\">\n              <path\n                fill=\"#fff\"\n                fillOpacity=\"1\"\n                fillRule=\"nonzero\"\n                stroke=\"none\"\n                d=\"m0 0-.09-.897-.089-.985-.18-.897-.268-.896-.174-.807-.27-.897-.358-.807-.359-.718-.353-.806-.448-.717-.448-.718-.533-.717-.449-.717-.532-.627-.628-.628-.533-.538-.716-.628-.623-.538-.717-.538-.712-.442-.712-.538-.807-.448-.802-.359-.801-.448-.897-.359-.891-.359-.891-.268-.891-.27-.807-.268-.891-.18-.802-.179-.801-.179-.897-.18-.892-.089-.801-.09-.897-.09-.98-.09-.892-.089h-3.749l-.892.089h-.98l-.892.09-.896.09-.981.09-.891.179-.891.09-.897.179-.892.179-.891.18-.891.179-.896.268-.802.18-.891.269-.892.269-.806.359-.891.269-.802.268-.892.359-.806.359-.802.359-.802.442-.806.359-.802.449-.712.447-.807.449-.712.448-.717.448-.712.538-.712.538-.717.538-.713.538-.627.538-.712.627.538.717.622.628.538.718.623.717.538.627.532.717.628.718.532.627.628.717.533.628.627.717.533.718.538.627.622.717.538.718.622.627.538.717.712-.538.802-.538.717-.538.802-.538.717-.448.802-.537.711-.449.808-.358.711-.449.802-.359.807-.358.801-.359.803-.269.806-.358.891-.269.892-.269.801-.269.897-.18.891-.179.891-.179.981-.09.896-.179h.892l.98-.089h1.962l.981.089.897.179.801.18.802.179.717.269.623.358.717.538.532.628.359.718.27.806.088.897v.179l-.088 1.076-.359.897-.449.627-.622.538-.718.538-.712.358-.801.359-.897.359-1.07.447-.623.18-.711.179-.807.27-.802.179-.891.269-.897.179-.98.269-.892.179-.981.269-.891.179-.897.269-.89.18-.892.269-.807.268-.89.18-.803.269-.801.269-.807.269-.981.359-.891.359-.892.358-.896.359-.801.448-.892.448-.717.448-.802.448-.712.538-.717.448-.622.539-.627.627-.623.628-.538.628-.532.627-.449.627-.443.718-.448.806-.359.622-.269.718-.263.807-.269.717-.18.897-.179.807-.09.896-.089.897-.09.985v2.063l.09.896.089.807.09.897.179.806.18.807.269.808.179.806.353.807.359.807.358.806.444.808.447.806.533.718.539.717.622.717.627.627.623.718.717.628.622.448.717.538.713.538.711.448.807.448.802.359.801.448.807.358.891.27.891.358.807.269.712.18.803.179.806.179.891.179.802.18.891.089.897.09.891.09.891.089h3.839l.981-.089.981-.09h.891l.986-.09.891-.179.981-.09.892-.179.807-.179.891-.179.891-.18.802-.179.896-.269.802-.269.802-.18.896-.358.802-.269.801-.358.802-.359.896-.359.802-.448.712-.359.807-.448.802-.448.712-.449.806-.538.713-.447.717-.539.712-.538.711-.537-.532-.718-.448-.717-.533-.717-.538-.718-.532-.806-.449-.717-.538-.718-.533-.717-.447-.717-.534-.718-.537-.717-.449-.717-.532-.807-.539-.717-.532-.717-.448-.717-.533-.717-.717.537-.801.449-.713.448-.717.538-.801.358-.718.449-.801.359-.712.358-.807.359-.712.358-.801.269-.717.359-.982.268-.891.27-.891.268-.897.18-.891.179-.891.18-.891.09-.897.089-.801.09h-1.962l-.981-.179-.897-.18-.801-.179-.712-.359-.628-.358-.802-.718-.538-.807-.352-.807-.091-.896v-.18l.091-1.165.442-.986.359-.538.622-.628.807-.448.712-.448.891-.359.986-.359 1.071-.358.712-.179.712-.269.807-.179.801-.269.891-.18.987-.269.981-.268.981-.27.98-.179.891-.269.981-.269.897-.179.892-.269.891-.269.801-.269.897-.269.802-.269.801-.269.986-.353.891-.449.891-.358.892-.448.807-.449.802-.448.711-.448.717-.538.713-.448.712-.628.717-.627.622-.718.627-.627.533-.718.538-.806.443-.717.449-.808.358-.717.269-.806.264-.807.179-.807.179-.897.179-.897.09-.896.09-.986V.986zm-62.594-17.926h-51.143v65.258h51.587V32.538h-34.543V21.87h31.062V7.979h-31.062V-3.137h34.991v-14.789zm-65.214 0h-16.333v38.589l-.447-.717-.533-.813-.449-.717-.532-.718-.448-.806-.539-.718-.442-.717-.449-.812-.532-.717-.449-.717-.537-.718-.443-.812-.538-.717-.443-.717-.449-.807-.538-.722-.443-.718-.538-.806-.442-.718-.538-.717-.443-.812-.449-.718-.537-.717-.443-.807-.538-.722-.443-.717-.538-.718-.449-.806-.443-.722-.537-.718-.443-.807-.538-.717-.448-.717-.533-.813-.448-.717h-.354l-.537.807-.449.723-.533.807-.448.717-.533.806-.448.723-.532.807-.449.718-.538.806-.443.717-.538.813-.442.717-.538.807-.449.717-.532.812-.449.717-.532.807-.538.717-.448.812-.533.717-.448.807-.533.717-.448.813-.533.717-.448.807-.538.717-.443.807-.538.723-.443.806-.538.718-.448.807-.532.716-.45.813-.532.717v-38.409h-16.96v65.258h18.3l.443-.718.448-.806.532-.712.449-.807.448-.717.443-.808.448-.711.534-.808.447-.717.449-.717.443-.801.448-.718.533-.806.448-.718.448-.801.443-.717.538-.717.449-.803.442-.716.448-.807.444-.718.538-.801.448-.718.442-.806.449-.712.443-.717.538-.807.448-.718.443-.807.448-.712.443-.807.539-.717.448-.801.443-.718.448.718.448.801.533.717.447.807.444.712.448.807.533.718.448.807.449.717.442.712.538.806.443.718.449.801.447.718.533.807.448.716.449.803.442.717.45.717.532.801.448.718.448.806.444.718.537.801.444.717.447.717.449.808.532.711.449.808.442.717.449.807.538.712.443.806.448.718h18.294v-65.258zM-231.367 8.965l-.269.812-.353.897-.359.807-.269.812-.353.807-.358.897-.27.812-.359.807-.352.806-.27.812-.359.897-.263.807-.359.812-.359.807-.268.807-.354.901-.358.808-.269.806-.359.812-.353.897-.269.812-.359.807-.353-.807-.268-.812-.359-.897-.359-.812-.264-.806-.358-.808-.359-.901-.353-.807-.27-.807-.358-.812-.359-.807-.264-.897-.358-.812-.359-.806-.268-.807-.354-.812-.359-.897-.358-.807-.263-.812-.359-.807-.359-.897-.269-.812-.353-.807h15.082zm28.03-26.891h-17.498l-.354.808-.269.807-.358.807-.359.896-.264.802-.358.806-.359.807-.264.807-.358.807-.359.807-.268.807-.354.896-.359.807-.269.807-.359.807h-25.614l-.353-.807-.269-.807-.359-.807-.358-.896-.264-.807-.358-.807-.359-.807-.269-.807-.353-.807-.359-.806-.269-.802-.354-.896-.358-.807-.269-.807-.359-.808h-18.025l.353.808.359.807.358.807.354.896.269.802.359.806.358.807.353.807.359.807.359.897.353.807.359.806.268.807.359.807.353.807.359.896.358.807.354.808.359.806.358.807.269.807.353.897.359.806.359.807.353.807.359.807.359.807.353.897.269.806.359.807.358.807.354.807.358.807.358.896.354.807.358.807.269.807.359.806.353.807.359.897.359.807.353.807.358.807.359.806.269.808.354.801.358.897.358.806.354.808.358.807.359.806.353.807.269.897.359.806.358.807.354.807.359.807.358.807.354.897.358.806.269.807.358.807.354.807.358.807.359.896.353.807.359.807.359.807.263.806.359.808.359.896.359.807.353.807.359.807.358.807.353.806.27.897.358.807.359.807.353.807h16.512l.358-.807.359-.807.354-.807.358-.897.269-.806.353-.807.359-.807.358-.807.359-.807.353-.896.359-.808.359-.806.263-.807.359-.807.359-.807.359-.896.353-.807.358-.807.359-.807.353-.807.269-.806.358-.897.354-.807.359-.807.358-.807.359-.807.353-.806.358-.897.27-.807.353-.806.358-.807.359-.808.359-.806.353-.897.359-.801.358-.808.264-.806.358-.807.359-.807.354-.807.358-.897.359-.807.359-.806.353-.807.269-.807.358-.807.354-.896.358-.807.359-.807.358-.807.354-.807.359-.806.268-.897.354-.807.358-.807.359-.807.353-.807.359-.806.359-.897.359-.807.263-.807.359-.806.359-.808.353-.807.358-.896.359-.807.358-.807.353-.807.27-.806.359-.807.353-.897.358-.807.358-.807.354-.807.358-.806.359-.802.27-.896.352-.807.359-.807.358-.808zm-78.193 8.334-.717-.538-.623-.449-.717-.538-.712-.448-.712-.538-.717-.448-.712-.449-.807-.447-.802-.449-.802-.448-.806-.353-.802-.449-.891-.358-.801-.359-.897-.358-.801-.359-.803-.269-.806-.269-.802-.27-.891-.268-.801-.27-.897-.179-.802-.179-.891-.179-.896-.179-.892-.09-.981-.09-.891-.09-.981-.089-.897-.09-.98-.089h-3.84l-.891.089-.981.09-.891.089-.891.09-.897.09-.891.179-.892.18-.801.179-.896.179-.802.269-.891.179-.807.27-.802.358-.802.269-.89.359-.807.358-.802.358-.801.359-.808.448-.711.444-.802.448-.717.449-.712.447-.717.539-.712.537-.713.538-.627.538-.622.538-.628.628-.622.537-.628.628-.622.628-.538.627-.533.717-.538.628-.448.717-.533.718-.447.716-.444.718-.448.807-.448.717-.353.807-.359.807-.358.807-.354.806-.269.717-.359.808-.179.807-.264.806-.179.896-.269.808-.179.896-.09.807-.18.897-.088.806-.091.897-.084.897-.089.896V15.6l.089.986v.896l.084.897.091.986.179.891.089.897.179.807.269.896.18.897.263.807.269.896.269.807.359.897.354.806.358.807.359.807.353.807.448.807.448.717.444.718.447.717.449.717.532.717.538.717.533.717.538.629.622.627.538.628.623.626.627.629.622.537.717.628.623.538.712.538.717.448.712.538.718.448.711.448.802.449.807.448.801.448.802.359.806.358.892.449.712.268.891.27.808.358.801.18.801.269.896.179.802.269.891.179.892.09.896.179.892.09.89.089.892.09.897.09h3.833l.987-.09.981-.09h.891l.891-.089.981-.18.807-.089.891-.18.892-.179.806-.179.801-.179.803-.18.807-.269.801-.179.712-.269.807-.269.802-.358.801-.359.807-.359.802-.448.801-.359.718-.448.801-.448.712-.448.807-.449.712-.537.712-.449.717-.538.712-.538.717-.627.712-.538-.538-.718-.622-.627-.538-.717-.622-.717-.538-.718-.533-.627-.628-.717-.532-.717-.538-.629-.623-.717-.537-.717-.623-.717-.538-.628-.532-.717-.627-.717-.534-.717-.627-.628-.533-.717-.717.538-.712.627-.717.449-.712.538-.712.448-.717.449-.713.447-.801.449-.717.358-.712.359-.717.269-.802.269-.801.269-.807.179-.891.18-.891.179-.892.089-.981.09-.986.089h-1.872l-.891-.089-.807-.09-.891-.179-.802-.18-.807-.268-.801-.269-.802-.359-.802-.358-.717-.448-.711-.449-.718-.449-.622-.537-.628-.538-.622-.538-.538-.627-.622-.628-.538-.717-.444-.628-.448-.717-.442-.807-.449-.717-.358-.807-.269-.807-.354-.807-.269-.896-.179-.892-.179-.806-.18-.987-.089-.896-.084-.896v-2.063l.084-.896.089-.807.09-.897.179-.806.18-.808.179-.806.269-.807.264-.717.359-.896.358-.808.443-.807.448-.717.448-.717.533-.718.538-.627.622-.628.539-.627.621-.538.718-.538.712-.538.711-.448.717-.448.803-.359.801-.359.806-.358.892-.269.891-.269.897-.18.891-.179.891-.089.981-.09h2.051l.987.09.981.089.891.09.891.18.897.179.891.268.801.18.803.358.717.359.801.359.627.358.713.449v8.158h-13.032v13.084h29.454V-9.055z\"\n              ></path>\n            </g>\n            <g transform=\"translate(312.995 481.16)\">\n              <path\n                fill=\"#fff\"\n                fillOpacity=\"1\"\n                fillRule=\"nonzero\"\n                stroke=\"none\"\n                d=\"M0 0h38.683v29.922H0v61.086h40.223v29.922h-73.072V-95.021h73.684v29.923H0z\"\n              ></path>\n            </g>\n            <g transform=\"translate(590.07 474.677)\">\n              <path\n                fill=\"#fff\"\n                fillOpacity=\"1\"\n                fillRule=\"nonzero\"\n                stroke=\"none\"\n                d=\"M0 0v-48.744c0-8.639-3.993-12.647-12.278-12.647h-6.144c-8.595 0-12.588 4.008-12.588 12.647V87.618c0 8.638 3.993 12.646 12.588 12.646h5.527c8.29 0 12.283-4.008 12.283-12.646V45.349h32.233v44.12c0 26.837-12.895 39.795-39.6 39.795h-15.969c-26.706 0-39.912-13.264-39.912-40.106V-50.284c0-26.843 13.206-40.106 39.912-40.106h16.274c26.712 0 39.911 13.263 39.911 40.106V0z\"\n              ></path>\n            </g>\n            <path\n              fill=\"#fff\"\n              fillOpacity=\"1\"\n              fillRule=\"nonzero\"\n              stroke=\"none\"\n              d=\"M475.995 386.138h32.854V602.09h-32.854z\"\n            ></path>\n            <g transform=\"translate(428.326 506.146)\">\n              <path\n                fill=\"#fff\"\n                fillOpacity=\"1\"\n                fillRule=\"nonzero\"\n                stroke=\"none\"\n                d=\"M0 0c0-8.639-3.987-12.652-12.277-12.652h-13.511v79.596h13.511C-3.987 66.944 0 62.935 0 54.298Zm-7.061 95.944h-51.577v-215.952h32.85v78.362h18.727c26.711 0 39.911 13.263 39.911 40.1v57.384c0 26.842-13.2 40.106-39.911 40.106\"\n              ></path>\n            </g>\n            <g transform=\"translate(357.642 190.875)\">\n              <path\n                fill=\"#fff\"\n                fillOpacity=\"1\"\n                fillRule=\"evenodd\"\n                stroke=\"none\"\n                d=\"M0 0h188.054L92.068-31.654Z\"\n              ></path>\n            </g>\n          </g>\n        </g>\n      </g>\n    </svg>\n  );\n}\n"
  },
  {
    "path": "docs/src/components/InfoSections.tsx",
    "content": "export function HowItWorksSection() {\n  return (\n    <section id=\"how-it-works\" className=\"py-16 sm:py-20 bg-gray-950\">\n      <div className=\"container mx-auto px-6\">\n        <div className=\"max-w-3xl mx-auto text-center\">\n          <h2 className=\"text-3xl font-bold mb-6 text-white\">How It Works</h2>\n          <p className=\"text-lg text-gray-300 leading-relaxed\">\n            This project utilizes Godot's{\" \"}\n            <strong className=\"text-blue-400\">GDExtension</strong> system to\n            wrap the official Epic Online Services C SDK. This allows seamless\n            integration and usage within Godot projects using GDScript, C#, or\n            other supported languages. It provides a familiar class hierarchy\n            and leverages Godot's signal system for handling asynchronous events\n            like user login, achievement unlocks, lobby updates, and more.\n          </p>\n        </div>\n      </div>\n    </section>\n  );\n}\n\nexport function InstallationSection() {\n  return (\n    <section id=\"installation\" className=\"py-16 sm:py-20 bg-gray-900\">\n      <div className=\"container mx-auto px-6\">\n        <h2 className=\"text-3xl font-bold mb-12 text-center text-white\">\n          Installation\n        </h2>\n        <div className=\"grid md:grid-cols-2 gap-10 max-w-5xl mx-auto\">\n          <div className=\"bg-gray-800 p-6 rounded-lg shadow-md border border-gray-700\">\n            <h3 className=\"text-xl font-semibold mb-4 text-white\">\n              Method 1: Asset Library (Recommended)\n            </h3>\n            <ol className=\"list-decimal list-inside space-y-2 text-gray-300\">\n              <li>\n                Open the <strong className=\"text-white\">AssetLib</strong> tab in\n                the Godot editor.\n              </li>\n              <li>\n                Search for{\" \"}\n                <code className=\"bg-gray-700 px-1.5 py-0.5 rounded text-gray-100\">\n                  EOSG\n                </code>{\" \"}\n                or{\" \"}\n                <code className=\"bg-gray-700 px-1.5 py-0.5 rounded text-gray-100\">\n                  Epic Online Services Godot\n                </code>\n                .\n              </li>\n              <li>\n                Find the plugin by{\" \"}\n                <strong className=\"text-white\">3ddelano</strong> and click on\n                it.\n              </li>\n              <li>\n                Click <strong className=\"text-blue-400\">Download</strong>, then{\" \"}\n                <strong className=\"text-blue-400\">Install</strong>.\n              </li>\n              <li>\n                Go to{\" \"}\n                <strong className=\"text-white\">\n                  Project {\"->\"} Project Settings {\"->\"} Plugins\n                </strong>\n                .\n              </li>\n              <li>\n                Enable the{\" \"}\n                <strong className=\"text-white\">\n                  Epic Online Services Godot (EOSG)\n                </strong>{\" \"}\n                plugin.\n              </li>\n              <li>Restart the Godot editor.</li>\n            </ol>\n            <a\n              href=\"https://godotengine.org/asset-library/asset/2453\"\n              target=\"_blank\"\n              rel=\"noopener noreferrer\"\n              className=\"inline-block mt-4 text-blue-400 hover:text-blue-300 underline\"\n            >\n              View on Godot Asset Library\n            </a>\n          </div>\n          <div className=\"bg-gray-800 p-6 rounded-lg shadow-md border border-gray-700\">\n            <h3 className=\"text-xl font-semibold mb-4 text-white\">\n              Method 2: GitHub Release\n            </h3>\n            <ol className=\"list-decimal list-inside space-y-2 text-gray-300\">\n              <li>\n                Download the latest release{\" \"}\n                <code className=\"bg-gray-700 px-1.5 py-0.5 rounded text-gray-100\">\n                  .zip\n                </code>{\" \"}\n                file from GitHub.\n              </li>\n              <li>Extract the zip archive.</li>\n              <li>\n                Copy the{\" \"}\n                <code className=\"bg-gray-700 px-1.5 py-0.5 rounded text-gray-100\">\n                  addons/epic-online-services-godot\n                </code>{\" \"}\n                folder into your project's{\" \"}\n                <code className=\"bg-gray-700 px-1.5 py-0.5 rounded text-gray-100\">\n                  res://addons/\n                </code>{\" \"}\n                folder (create it if needed).\n              </li>\n              <li>\n                Go to{\" \"}\n                <strong className=\"text-white\">\n                  Project {\"->\"} Project Settings {\"->\"} Plugins\n                </strong>\n                .\n              </li>\n              <li>\n                Enable the{\" \"}\n                <strong className=\"text-white\">\n                  Epic Online Services Godot (EOSG)\n                </strong>{\" \"}\n                plugin.\n              </li>\n              <li>Restart the Godot editor.</li>\n            </ol>\n            <a\n              href=\"https://github.com/3ddelano/epic-online-services-godot/releases/latest\"\n              target=\"_blank\"\n              rel=\"noopener noreferrer\"\n              className=\"inline-block mt-4 text-blue-400 hover:text-blue-300 underline\"\n            >\n              Download from GitHub Releases\n            </a>\n          </div>\n        </div>\n        <p className=\"text-center mt-8 text-gray-400\">\n          After installation, you can start using the{\" \"}\n          <code className=\"bg-gray-700 px-1.5 py-0.5 rounded text-gray-100\">\n            EOS\n          </code>{\" \"}\n          and{\" \"}\n          <code className=\"bg-gray-700 px-1.5 py-0.5 rounded text-gray-100\">\n            H\n          </code>{\" \"}\n          classes in your scripts.\n        </p>\n      </div>\n    </section>\n  );\n}\n"
  },
  {
    "path": "docs/src/components/Layout.tsx",
    "content": "import { useState } from \"react\";\n\n// Navigation links data\nconst NAV_LINKS = [\n  {\n    label: \"Docs\",\n    href: \"docs/introduction\",\n    external: false,\n  },\n  {\n    label: \"Showcase\",\n    href: \"showcase\",\n    external: false,\n  },\n  {\n    label: \"GitHub\",\n    href: \"https://github.com/3ddelano/epic-online-services-godot\",\n    external: true,\n    icon: (\n      <svg\n        xmlns=\"http://www.w3.org/2000/svg\"\n        className=\"w-4 h-4\"\n        fill=\"#fff\"\n        viewBox=\"0 0 256 256\"\n      >\n        <path\n          d=\"M17.791 46.836A2 2 0 0 0 19 45v-5.4q.002-.297.041-.61L19 39h-3.6c-1.5 0-2.8-.6-3.4-1.8-.7-1.3-1-3.5-2.8-4.7-.3-.2-.1-.5.5-.5.6.1 1.9.9 2.7 2 .9 1.1 1.8 2 3.4 2 2.487 0 3.82-.125 4.622-.555C21.356 34.056 22.649 33 24 33v-.025c-5.668-.182-9.289-2.066-10.975-4.975-3.665.042-6.856.405-8.677.707a22 22 0 0 1-.151-.987c1.797-.296 4.843-.647 8.345-.714a8 8 0 0 1-.291-.849c-3.511-.178-6.541-.039-8.187.097-.02-.332-.047-.663-.051-.999 1.649-.135 4.597-.27 8.018-.111a10 10 0 0 1-.13-1.543c0-1.7.6-3.5 1.7-5-.5-1.7-1.2-5.3.2-6.6 2.7 0 4.6 1.3 5.5 2.1C21 13.4 22.9 13 25 13s4 .4 5.6 1.1c.9-.8 2.8-2.1 5.5-2.1 1.5 1.4.7 5 .2 6.6 1.1 1.5 1.7 3.2 1.6 5 0 .484-.045.951-.11 1.409 3.499-.172 6.527-.034 8.204.102-.002.337-.033.666-.051.999-1.671-.138-4.775-.28-8.359-.089a8 8 0 0 1-.325.98c3.546.046 6.665.389 8.548.689q-.064.498-.151.987c-1.912-.306-5.171-.664-8.879-.682-1.665 2.878-5.22 4.755-10.777 4.974V33c2.6 0 5 3.9 5 6.6V45c0 .823.498 1.53 1.209 1.836C41.37 43.804 48 35.164 48 25 48 12.318 37.683 2 25 2S2 12.318 2 25c0 10.164 6.63 18.804 15.791 21.836\"\n          fontFamily=\"none\"\n          fontSize=\"none\"\n          fontWeight=\"none\"\n          style={{ mixBlendMode: \"normal\" }}\n          textAnchor=\"none\"\n          transform=\"scale(5.12)\"\n        ></path>\n      </svg>\n    ),\n  },\n];\n\nexport function NavBar() {\n  const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false);\n\n  return (\n    <nav className=\"fixed top-0 left-0 right-0 z-[100] glass py-4 px-6 h-16 navbar\">\n      <div className=\"container mx-auto flex items-center justify-between\">\n        <a\n          href=\"/epic-online-services-godot/\"\n          className=\"group flex items-center gap-3 no-underline\"\n        >\n          <img\n            src=\"img/eosg-logo.svg\"\n            alt=\"Logo\"\n            className=\"w-8 h-8 group-hover:rotate-12 transition-transform duration-500\"\n          />\n          <span className=\"text-white text-sm font-bold tracking-tight uppercase group-hover:text-blue-400 transition-colors\">\n            EOS Godot\n          </span>\n        </a>\n\n        {/* Desktop menu */}\n        <div className=\"hidden sm:flex items-center gap-8\">\n          {NAV_LINKS.map((link) => (\n            <a\n              key={link.label}\n              href={link.href}\n              {...(link.external && {\n                rel: \"noopener noreferrer\",\n                target: \"_blank\",\n              })}\n              className={\n                link.label === \"GitHub\"\n                  ? \"button-secondary px-4 py-2 rounded-lg text-xs font-bold uppercase tracking-widest no-underline flex items-center gap-2\"\n                  : \"text-white hover:text-blue-400 active:text-blue-400 text-sm font-semibold uppercase tracking-wider transition-colors no-underline\"\n              }\n            >\n              {link.icon}\n              {link.label}\n            </a>\n          ))}\n        </div>\n\n        {/* Mobile menu button */}\n        <button\n          className=\"sm:hidden p-2 -mr-2\"\n          onClick={() => setIsMobileMenuOpen(!isMobileMenuOpen)}\n          aria-label=\"Toggle menu\"\n        >\n          <svg\n            className=\"w-6 h-6 text-white\"\n            fill=\"none\"\n            stroke=\"currentColor\"\n            viewBox=\"0 0 24 24\"\n          >\n            {isMobileMenuOpen ? (\n              <path\n                strokeLinecap=\"round\"\n                strokeLinejoin=\"round\"\n                strokeWidth=\"2\"\n                d=\"M6 18L18 6M6 6l12 12\"\n              />\n            ) : (\n              <path\n                strokeLinecap=\"round\"\n                strokeLinejoin=\"round\"\n                strokeWidth=\"2\"\n                d=\"M4 6h16M4 12h16m-7 6h7\"\n              />\n            )}\n          </svg>\n        </button>\n      </div>\n\n      {/* Mobile menu dropdown */}\n      {isMobileMenuOpen && (\n        <div className=\"sm:hidden absolute top-16 left-0 right-0 backdrop-blur-xl bg-gray-900/95 border-t border-b border-white/10 p-4 shadow-lg\">\n          <div className=\"container mx-auto px-6 py-4 flex flex-col gap-4\">\n            {NAV_LINKS.map((link) => (\n              <a\n                key={link.label}\n                href={link.href}\n                {...(link.external && {\n                  rel: \"noopener noreferrer\",\n                  target: \"_blank\",\n                })}\n                className=\"text-white hover:text-blue-400 active:text-blue-400 text-sm font-semibold uppercase tracking-wider transition-colors no-underline flex items-center gap-2\"\n                onClick={() => setIsMobileMenuOpen(false)}\n              >\n                {link.icon}\n                {link.label}\n              </a>\n            ))}\n          </div>\n        </div>\n      )}\n    </nav>\n  );\n}\n\nexport function Footer() {\n  return (\n    <footer className=\"bg-[#030712] border-t border-white/5 pt-12 pb-8\">\n      <div className=\"container px-6\">\n        <div className=\"glass rounded-xl text-yellow-300/80 text-xs p-5 max-w-3xl mb-10\">\n          <p className=\"leading-relaxed\">\n            <strong className=\"text-yellow-200\">Disclaimer: </strong>This\n            project Epic Online Services Godot (EOSG) is <strong>NOT</strong>{\" \"}\n            affiliated with Epic Games Inc or Godot Engine. It does not endorse\n            Epic Online Services. This project and the sample Godot scenes are\n            provided solely for educational purposes and may or may not comply\n            with Epic Games' Design Guidelines. If you plan to release a game\n            using EOS, ensure you read the official{\" \"}\n            <a\n              href=\"https://dev.epicgames.com/docs/services/en-US/EpicAccountServices/DesignGuidelines/index.html\"\n              target=\"_blank\"\n              rel=\"noopener noreferrer\"\n              className=\"underline hover:text-yellow-100 transition-colors\"\n            >\n              Guidelines\n            </a>{\" \"}\n            and fulfill all requirements (user consent, data deletion, privacy\n            policy, etc.).\n          </p>\n        </div>\n\n        <p className=\"text-gray-500 text-sm\">\n          Copyright &copy; {new Date().getFullYear()}{\" \"}\n          <a\n            href=\"https://github.com/3ddelano\"\n            target=\"_blank\"\n            rel=\"noopener noreferrer\"\n            className=\"text-blue-400/80 hover:text-blue-300 transition-colors\"\n          >\n            Delano Lourenco\n          </a>\n          . All rights reserved.\n        </p>\n        <p className=\"text-gray-600 text-xs mt-2\">\n          Epic Games, Epic Online Services, Godot Engine, and their respective\n          logos are trademarks or registered trademarks of their respective\n          owners.\n        </p>\n      </div>\n    </footer>\n  );\n}\n"
  },
  {
    "path": "docs/src/components/MainSystemsSection.tsx",
    "content": "const MAIN_SYSTEMS = [\n  {\n    title: \"High Level EOS\",\n    tag: \"Recommended\",\n    description:\n      \"Provides easy-to-use methods and signals to interact with EOS. Ideal for most cases and rapid development.\",\n    link: \"docs/introduction\",\n    icon: (\n      <svg\n        className=\"w-6 h-6 text-blue-400\"\n        fill=\"none\"\n        stroke=\"currentColor\"\n        viewBox=\"0 0 24 24\"\n      >\n        <path\n          strokeLinecap=\"round\"\n          strokeLinejoin=\"round\"\n          strokeWidth=\"2\"\n          d=\"M13 10V3L4 14h7v7l9-11h-7z\"\n        ></path>\n      </svg>\n    ),\n    color: \"blue\",\n  },\n  {\n    title: \"GDExtension EOS\",\n    tag: \"Advanced\",\n    description:\n      \"Offers advanced EOS usage with direct access to the C SDK via GDExtension. Suitable for complex needs.\",\n    extra: (\n      <>\n        Provides{\" \"}\n        <code className=\"bg-purple-500/10 px-2 py-0.5 rounded text-purple-300 font-mono text-xs\">\n          EOS\n        </code>{\" \"}\n        and{\" \"}\n        <code className=\"bg-purple-500/10 px-2 py-0.5 rounded text-purple-300 font-mono text-xs\">\n          IEOS\n        </code>{\" \"}\n        classes.\n      </>\n    ),\n    icon: (\n      <svg\n        className=\"w-6 h-6 text-purple-400\"\n        fill=\"none\"\n        stroke=\"currentColor\"\n        viewBox=\"0 0 24 24\"\n      >\n        <path\n          strokeLinecap=\"round\"\n          strokeLinejoin=\"round\"\n          strokeWidth=\"2\"\n          d=\"M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4\"\n        ></path>\n      </svg>\n    ),\n    color: \"purple\",\n  },\n];\n\nexport function MainSystemsSection() {\n  return (\n    <section id=\"main-systems\" className=\"py-20 sm:py-24 bg-[#030712] relative\">\n      <div className=\"container mx-auto px-6\">\n        <h2 className=\"text-3xl font-bold mb-4 text-center text-white tracking-tight\">\n          Two Main Systems\n        </h2>\n        <p className=\"text-gray-400 text-center mb-14 max-w-2xl mx-auto font-light\">\n          Choose the approach that fits your project's complexity.\n        </p>\n        <div className=\"grid md:grid-cols-2 gap-8 max-w-5xl mx-auto\">\n          {MAIN_SYSTEMS.map((system, i) => (\n            <div\n              key={i}\n              className={`glass rounded-2xl p-8 transition-all duration-300 hover:-translate-y-1 hover:shadow-xl hover:shadow-${system.color}-500/5 border-${system.color}-500/20 hover:border-${system.color}-500/40`}\n              style={{\n                borderColor: `rgba(${\n                  system.color === \"blue\" ? \"59,130,246\" : \"168,85,247\"\n                },0.2)`,\n              }}\n            >\n              <div\n                className={`mb-5 w-12 h-12 rounded-xl bg-${system.color}-500/10 flex items-center justify-center`}\n              >\n                {system.icon}\n              </div>\n              <h3 className=\"text-xl font-bold mb-3 text-white\">\n                {system.title}\n              </h3>\n              <span\n                className={`inline-block mb-4 text-xs font-bold uppercase tracking-widest text-${system.color}-400 bg-${system.color}-500/10 px-3 py-1 rounded-full`}\n              >\n                {system.tag}\n              </span>\n              <p className=\"text-gray-400 mb-4 font-light leading-relaxed\">\n                {system.description}\n              </p>\n              {system.link && (\n                <a\n                  href={system.link}\n                  className={`inline-flex items-center text-${system.color}-400 hover:text-${system.color}-300 font-semibold text-sm no-underline transition-colors`}\n                >\n                  Learn more\n                  <svg\n                    className=\"w-4 h-4 ml-1\"\n                    fill=\"none\"\n                    stroke=\"currentColor\"\n                    viewBox=\"0 0 24 24\"\n                  >\n                    <path\n                      strokeLinecap=\"round\"\n                      strokeLinejoin=\"round\"\n                      strokeWidth=\"2\"\n                      d=\"M9 5l7 7-7 7\"\n                    ></path>\n                  </svg>\n                </a>\n              )}\n              {system.extra && (\n                <p className=\"text-gray-500 text-sm\">{system.extra}</p>\n              )}\n            </div>\n          ))}\n        </div>\n      </div>\n    </section>\n  );\n}\n"
  },
  {
    "path": "docs/src/components/MediaSections.tsx",
    "content": "const SCREENSHOTS_DATA = [\n  {\n    category: \"Windows\",\n    images: [\n      {\n        src: \"img/screenshots/windows_auth_success.png\",\n        alt: \"Windows Auth Success Screenshot\",\n      },\n    ],\n  },\n  {\n    category: \"Android\",\n    images: [\n      {\n        src: \"img/screenshots/android_auth_success.jpg\",\n        alt: \"Android Auth Success Screenshot\",\n      },\n      {\n        src: \"img/screenshots/android_p2p_game.jpg\",\n        alt: \"Android P2P Game Screenshot\",\n      },\n    ],\n  },\n  {\n    category: \"iOS / macOS\",\n    images: [\n      {\n        src: \"img/screenshots/ios_simulator_auth_success.png\",\n        alt: \"iOS Simulator Auth Success Screenshot\",\n      },\n      {\n        src: \"img/screenshots/ios_simulator_in_lobby.png\",\n        alt: \"iOS Simulator In Lobby Screenshot\",\n        subtitle: \"Cross-Platform Lobbies\",\n      },\n      {\n        src: \"img/screenshots/mac_in_lobby.png\",\n        alt: \"macOS In Lobby Screenshot\",\n      },\n    ],\n  },\n];\n\nconst TUTORIALS_DATA = {\n  playlist_url:\n    \"https://www.youtube.com/playlist?list=PL5t0hR7ADzun5JYF4e2a2FtZEWYHxK83_\",\n  thumbnail_url: \"https://img.youtube.com/vi/ENyvF4yVjKg/0.jpg\",\n  thumbnail_alt: \"Epic Online Services Tutorial Series Thumbnail\",\n};\n\nexport function ScreenshotsSection() {\n  return (\n    <section id=\"screenshots\" className=\"py-20 sm:py-24 bg-[#030712]\">\n      <div className=\"container mx-auto px-6\">\n        <h2 className=\"text-3xl font-bold mb-4 text-center text-white tracking-tight\">\n          Screenshots & Demos\n        </h2>\n        <p className=\"text-gray-400 text-center mb-14 max-w-2xl mx-auto font-light\">\n          See the plugin running on multiple platforms.\n        </p>\n        <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-8\">\n          {SCREENSHOTS_DATA.map((platform, i) => (\n            <div key={i} className=\"flex items-center flex-col\">\n              <h3 className=\"text-lg font-bold mb-4 text-center text-gray-200 uppercase tracking-wider\">\n                {platform.category}\n              </h3>\n              {platform.images.map((image, j) => (\n                <div key={j} className=\"flex flex-col items-center w-full\">\n                  {image.subtitle && (\n                    <h4 className=\"text-sm font-bold my-3 text-center text-gray-400 uppercase tracking-wider\">\n                      {image.subtitle}\n                    </h4>\n                  )}\n                  <img\n                    src={image.src}\n                    alt={image.alt}\n                    className={`w-full max-w-[800px] h-auto rounded-xl glass border-white/10 hover:brightness-110 transition-all duration-300 ${\n                      j < platform.images.length - 1 ? \"mb-4\" : \"\"\n                    }`}\n                  />\n                </div>\n              ))}\n            </div>\n          ))}\n        </div>\n      </div>\n    </section>\n  );\n}\n\nexport function DemoSection() {\n  return (\n    <section id=\"demo\" className=\"py-20 sm:py-24 bg-[#0a0f1e]\">\n      <div className=\"container mx-auto px-6 text-center\">\n        <h2 className=\"text-3xl font-bold mb-4 text-white tracking-tight\">\n          Video Tutorials\n        </h2>\n        <p className=\"text-gray-400 mb-10 max-w-2xl mx-auto font-light\">\n          Watch the tutorial playlist on YouTube for a visual guide and\n          examples.\n        </p>\n        <div className=\"max-w-3xl mx-auto aspect-video rounded-2xl overflow-hidden glass\">\n          <a\n            href={TUTORIALS_DATA.playlist_url}\n            target=\"_blank\"\n            rel=\"noopener noreferrer\"\n            className=\"block relative group\"\n          >\n            <img\n              src={TUTORIALS_DATA.thumbnail_url}\n              alt={TUTORIALS_DATA.thumbnail_alt}\n              className=\"w-full h-full object-cover\"\n            />\n            <div className=\"absolute inset-0 bg-black/50 flex items-center justify-center opacity-0 group-hover:opacity-100 transition-opacity duration-300\">\n              <div className=\"w-20 h-20 rounded-full bg-white/10 backdrop-blur-sm flex items-center justify-center border border-white/20\">\n                <svg\n                  className=\"w-10 h-10 text-white ml-1\"\n                  fill=\"currentColor\"\n                  viewBox=\"0 0 20 20\"\n                >\n                  <path d=\"M6.5 5.5v9l7-4.5-7-4.5z\"></path>\n                </svg>\n              </div>\n            </div>\n          </a>\n        </div>\n        <a\n          href={TUTORIALS_DATA.playlist_url}\n          target=\"_blank\"\n          rel=\"noopener noreferrer\"\n          className=\"inline-block mt-8 text-blue-400 hover:text-blue-300 font-semibold text-sm no-underline transition-colors\"\n        >\n          Watch the playlist on YouTube →\n        </a>\n      </div>\n    </section>\n  );\n}\n"
  },
  {
    "path": "docs/src/components/SupportSection.tsx",
    "content": "const SUPPORT_DATA = {\n  bmc_url: \"https://www.buymeacoffee.com/3ddelano\",\n  github_sponsor_url: \"https://github.com/sponsors/3ddelano\",\n  discord_url: \"https://discord.gg/FZY9TqW\",\n  username: \"@3ddelano\",\n};\n\nexport function SupportSection() {\n  return (\n    <section\n      id=\"support\"\n      className=\"py-20 sm:py-24 bg-[#030712] relative overflow-hidden\"\n    >\n      {/* Background glow */}\n      <div className=\"absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-[600px] h-[400px] bg-blue-600/5 rounded-full blur-[120px]\"></div>\n\n      <div className=\"container mx-auto px-6 text-center relative z-10\">\n        <h2 className=\"text-3xl font-bold mb-4 text-white tracking-tight\">\n          Support Development\n        </h2>\n        <p className=\"text-gray-400 mb-10 max-w-2xl mx-auto font-light leading-relaxed\">\n          Creating and maintaining this plugin requires significant time and\n          effort. If you find this project helpful, please consider supporting\n          its development.\n        </p>\n        <div className=\"flex flex-wrap justify-center items-center gap-6 mb-10\">\n          <a\n            href={SUPPORT_DATA.bmc_url}\n            target=\"_blank\"\n            rel=\"noopener noreferrer\"\n            className=\"inline-block transition transform hover:scale-105\"\n          >\n            <img\n              height=\"45\"\n              width=\"180\"\n              src=\"https://cdn.buymeacoffee.com/buttons/v2/default-red.png\"\n              alt=\"Buy Me A Coffee\"\n            />\n          </a>\n          <a\n            href={SUPPORT_DATA.github_sponsor_url}\n            target=\"_blank\"\n            rel=\"noopener noreferrer\"\n            className=\"button-primary px-6 py-3 rounded-xl text-sm font-bold no-underline inline-flex items-center gap-2\"\n          >\n            <svg className=\"w-5 h-5\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n              <path\n                fillRule=\"evenodd\"\n                d=\"M8 1.314C12.438-3.248 23.534 4.735 8 15-7.534 4.736 3.562-3.248 8 1.314z\"\n              />\n            </svg>\n            GitHub Sponsor\n          </a>\n        </div>\n\n        <div className=\"glass rounded-2xl p-8 max-w-xl mx-auto\">\n          <p className=\"text-gray-300 mb-4 font-medium\">\n            Need help, have suggestions, or found a bug?\n          </p>\n          <div className=\"flex flex-wrap justify-center items-center gap-4\">\n            <a\n              href={SUPPORT_DATA.discord_url}\n              target=\"_blank\"\n              rel=\"noopener noreferrer\"\n              className=\"button-secondary px-5 py-2.5 rounded-xl text-sm font-bold no-underline inline-flex items-center gap-2\"\n            >\n              <svg className=\"w-5 h-5\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n                <path d=\"M19.27 5.33C17.94 4.71 16.5 4.26 15 4a.09.09 0 0 0-.07.03c-.18.33-.39.76-.53 1.09a16.09 16.09 0 0 0-4.8 0c-.14-.34-.35-.76-.54-1.09a.09.09 0 0 0-.07-.03c-1.5.26-2.93.71-4.27 1.33a.07.07 0 0 0-.05.08c-.67 1.9-.94 3.9-.94 6s.27 4.09.94 6a.07.07 0 0 0 .05.08c1.34.61 2.77 1.07 4.27 1.33a.09.09 0 0 0 .07-.03c.19-.34.4-.77.54-1.1a16.28 16.28 0 0 0 5.34-.01c.14.33.35.76.53 1.1a.09.09 0 0 0 .07.03c1.5-.26 2.93-.71 4.27-1.33a.07.07 0 0 0 .05-.08c.67-1.91.94-3.91.94-6s-.28-4.09-.94-6a.07.07 0 0 0-.05-.08zM8.5 13.5c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zm7 0c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5z\" />\n              </svg>\n              Join Discord\n            </a>\n            <span className=\"text-gray-500 text-sm\">\n              or DM{\" \"}\n              <code className=\"glass px-2 py-0.5 rounded text-gray-300 font-mono text-xs\">\n                {SUPPORT_DATA.username}\n              </code>\n            </span>\n          </div>\n        </div>\n      </div>\n    </section>\n  );\n}\n"
  },
  {
    "path": "docs/src/css/custom.css",
    "content": "@import \"tailwindcss\";\n\n@import url(\"https://fonts.googleapis.com/css2?family=Outfit:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap\");\n\n:root {\n  --ifm-font-family-base: \"Outfit\", sans-serif;\n  --ifm-font-family-monospace: \"JetBrains Mono\", monospace;\n\n  --ifm-color-primary: #3b82f6;\n  --ifm-color-primary-dark: #2563eb;\n  --ifm-color-primary-darker: #1d4ed8;\n  --ifm-color-primary-darkest: #1e40af;\n  --ifm-color-primary-light: #60a5fa;\n  --ifm-color-primary-lighter: #93c5fd;\n  --ifm-color-primary-lightest: #bfdbfe;\n\n  --ifm-code-font-size: 90%;\n  --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.1);\n\n  --brand-gradient: linear-gradient(135deg, #3b82f6 0%, #8b5cf6 100%);\n  --glass-bg: rgba(255, 255, 255, 0.03);\n  --glass-border: rgba(255, 255, 255, 0.08);\n}\n\n[data-theme='dark'] {\n  --ifm-background-color: #030712;\n  --ifm-navbar-background-color: rgba(3, 7, 18, 0.8);\n  --ifm-footer-background-color: #030712;\n\n  --ifm-color-primary: #60a5fa;\n  --ifm-color-primary-dark: #3b82f6;\n  --ifm-color-primary-darker: #2563eb;\n  --ifm-color-primary-darkest: #1d4ed8;\n  --ifm-color-primary-light: #93c5fd;\n  --ifm-color-primary-lighter: #bfdbfe;\n  --ifm-color-primary-lightest: #dbeafe;\n\n  --docusaurus-highlighted-code-line-bg: rgba(255, 255, 255, 0.1);\n}\n\n/* Glassmorphism utility */\n.glass {\n  background: var(--glass-bg);\n  backdrop-filter: blur(12px);\n  -webkit-backdrop-filter: blur(12px);\n  border: 1px solid var(--glass-border);\n}\n\n.hero-image {\n  background-color: #030712;\n  background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='192' height='192' viewBox='0 0 192 192'%3E%3Cpath fill='%233b82f6' fill-opacity='0.04' d='M192 15v2a11 11 0 0 0-11 11c0 1.94 1.16 4.75 2.53 6.11l2.36 2.36a6.93 6.93 0 0 1 1.22 7.56l-.43.84a8.08 8.08 0 0 1-6.66 4.13H145v35.02a6.1 6.1 0 0 0 3.03 4.87l.84.43c1.58.79 4 .4 5.24-.85l2.36-2.36a12.04 12.04 0 0 1 7.51-3.11 13 13 0 1 1 .02 26 12 12 0 0 1-7.53-3.11l-2.36-2.36a4.93 4.93 0 0 0-5.24-.85l-.84.43a6.1 6.1 0 0 0-3.03 4.87V143h35.02a8.08 8.08 0 0 1 6.66 4.13l.43.84a6.91 6.91 0 0 1-1.22 7.56l-2.36 2.36A10.06 10.06 0 0 0 181 164a11 11 0 0 0 11 11v2a13 13 0 0 1-13-13 12 12 0 0 1 3.11-7.53l2.36-2.36a4.93 4.93 0 0 0 .85-5.24l-.43-.84a6.1 6.1 0 0 0-4.87-3.03H145v35.02a8.08 8.08 0 0 1-4.13 6.66l-.84.43a6.91 6.91 0 0 1-7.56-1.22l-2.36-2.36A10.06 10.06 0 0 0 124 181a11 11 0 0 0-11 11h-2a13 13 0 0 1 13-13c2.47 0 5.79 1.37 7.53 3.11l2.36 2.36a4.94 4.94 0 0 0 5.24.85l.84-.43a6.1 6.1 0 0 0 3.03-4.87V145h-35.02a8.08 8.08 0 0 1-6.66-4.13l-.43-.84a6.91 6.91 0 0 1 1.22-7.56l2.36-2.36A10.06 10.06 0 0 0 107 124a11 11 0 0 0-22 0c0 1.94 1.16 4.75 2.53 6.11l2.36 2.36a6.93 6.93 0 0 1 1.22 7.56l-.43.84a8.08 8.08 0 0 1-6.66 4.13H49v35.02a6.1 6.1 0 0 0 3.03 4.87l.84.43c1.58.79 4 .4 5.24-.85l2.36-2.36a12.04 12.04 0 0 1 7.51-3.11A13 13 0 0 1 81 192h-2a11 11 0 0 0-11-11c-1.94 0-4.75 1.16-6.11 2.53l-2.36 2.36a6.93 6.93 0 0 1-7.56 1.22l-.84-.43a8.08 8.08 0 0 1-4.13-6.66V145H11.98a6.1 6.1 0 0 0-4.87 3.03l-.43.84c-.79 1.58-.4 4 .85 5.24l2.36 2.36a12.04 12.04 0 0 1 3.11 7.51A13 13 0 0 1 0 177v-2a11 11 0 0 0 11-11c0-1.94-1.16-4.75-2.53-6.11l-2.36-2.36a6.93 6.93 0 0 1-1.22-7.56l.43-.84a8.08 8.08 0 0 1 6.66-4.13H47v-35.02a6.1 6.1 0 0 0-3.03-4.87l-.84-.43c-1.59-.8-4-.4-5.24.85l-2.36 2.36A12 12 0 0 1 28 109a13 13 0 1 1 0-26c2.47 0 5.79 1.37 7.53 3.11l2.36 2.36a4.94 4.94 0 0 0 5.24.85l.84-.43A6.1 6.1 0 0 0 47 84.02V49H11.98a8.08 8.08 0 0 1-6.66-4.13l-.43-.84a6.91 6.91 0 0 1 1.22-7.56l2.36-2.36A10.06 10.06 0 0 0 11 28 11 11 0 0 0 0 17v-2a13 13 0 0 1 13 13c0 2.47-1.37 5.79-3.11 7.53l-2.36 2.36a4.94 4.94 0 0 0-.85 5.24l.43.84A6.1 6.1 0 0 0 11.98 47H47V11.98a8.08 8.08 0 0 1 4.13-6.66l.84-.43a6.91 6.91 0 0 1 7.56 1.22l2.36 2.36A10.06 10.06 0 0 0 68 11 11 11 0 0 0 79 0h2a13 13 0 0 1-13 13 12 12 0 0 1-7.53-3.11l-2.36-2.36a4.93 4.93 0 0 0-5.24-.85l-.84.43A6.1 6.1 0 0 0 49 11.98V47h35.02a8.08 8.08 0 0 1 6.66 4.13l.43.84a6.91 6.91 0 0 1-1.22 7.56l-2.36 2.36A10.06 10.06 0 0 0 85 68a11 11 0 0 0 22 0c0-1.94-1.16-4.75-2.53-6.11l-2.36-2.36a6.93 6.93 0 0 1-1.22-7.56l.43-.84a8.08 8.08 0 0 1 6.66-4.13H143V11.98a6.1 6.1 0 0 0-3.03-4.87l-.84-.43c-1.59-.8-4-.4-5.24.85l-2.36 2.36A12 12 0 0 1 124 13a13 13 0 0 1-13-13h2a11 11 0 0 0 11 11c1.94 0 4.75-1.16 6.11-2.53l2.36-2.36a6.93 6.93 0 0 1 7.56-1.22l.84.43a8.08 8.08 0 0 1 4.13 6.66V47h35.02a6.1 6.1 0 0 0 4.87-3.03l.43-.84c.8-1.59.4-4-.85-5.24l-2.36-2.36A12 12 0 0 1 179 28a13 13 0 0 1 13-13zM84.02 143a6.1 6.1 0 0 0 4.87-3.03l.43-.84c.8-1.59.4-4-.85-5.24l-2.36-2.36A12 12 0 0 1 83 124a13 13 0 1 1 26 0c0 2.47-1.37 5.79-3.11 7.53l-2.36 2.36a4.94 4.94 0 0 0-.85 5.24l.43.84a6.1 6.1 0 0 0 4.87 3.03H143v-35.02a8.08 8.08 0 0 1 4.13-6.66l.84-.43a6.91 6.91 0 0 1 7.56 1.22l2.36 2.36A10.06 10.06 0 0 0 164 107a11 11 0 0 0 0-22c-1.94 0-4.75 1.16-6.11 2.53l-2.36 2.36a6.93 6.93 0 0 1-7.56 1.22l-.84-.43a8.08 8.08 0 0 1-4.13-6.66V49h-35.02a6.1 6.1 0 0 0-4.87 3.03l-.43.84c-.79 1.58-.4 4 .85 5.24l2.36 2.36a12.04 12.04 0 0 1 3.11 7.51A13 13 0 1 1 83 68a12 12 0 0 1 3.11-7.53l2.36-2.36a4.93 4.93 0 0 0 .85-5.24l-.43-.84A6.1 6.1 0 0 0 84.02 49H49v35.02a8.08 8.08 0 0 1-4.13 6.66l-.84.43a6.91 6.91 0 0 1-7.56-1.22l-2.36-2.36A10.06 10.06 0 0 0 28 85a11 11 0 0 0 0 22c1.94 0 4.75-1.16 6.11-2.53l2.36-2.36a6.93 6.93 0 0 1 7.56-1.22l.84.43a8.08 8.08 0 0 1 4.13 6.66V143h35.02z'%3E%3C/path%3E%3C/svg%3E\");\n}\n\n/* Navbar glassmorphism */\n.navbar {\n  backdrop-filter: blur(12px);\n  -webkit-backdrop-filter: blur(12px);\n  border-bottom: 1px solid var(--glass-border);\n  \n  /* Override Docusaurus link color variables */\n  --ifm-link-color: white;\n  --ifm-link-hover-color: #60a5fa;\n  --ifm-link-decoration: none;\n  --ifm-link-hover-decoration: none;\n}\n\n/* Override Docusaurus link colors in navbar */\n.navbar a:not(.button-secondary) {\n  color: white !important;\n}\n\n.navbar a:not(.button-secondary):hover,\n.navbar a:not(.button-secondary):active {\n  color: #60a5fa !important;\n}\n\n/* Button system */\n.button-primary {\n  background: var(--brand-gradient);\n  border: none;\n  color: white;\n  font-weight: 600;\n  transition: all 0.3s ease;\n  box-shadow: 0 4px 15px rgba(59, 130, 246, 0.3);\n}\n\n.button-primary:hover {\n  transform: translateY(-2px);\n  box-shadow: 0 8px 25px rgba(59, 130, 246, 0.5);\n  color: white !important;\n  text-decoration: none;\n}\n\n.button-secondary {\n  background: var(--glass-bg);\n  border: 1px solid var(--glass-border);\n  color: white;\n  backdrop-filter: blur(8px);\n  transition: all 0.3s ease;\n}\n\n.button-secondary:hover {\n  background: rgba(255, 255, 255, 0.08);\n  border-color: rgba(255, 255, 255, 0.2);\n  color: white !important;\n  text-decoration: none;\n}\n\n/* Feature cards */\n.feature-card {\n  background: var(--glass-bg);\n  border: 1px solid var(--glass-border);\n  backdrop-filter: blur(8px);\n  transition: all 0.3s ease;\n}\n\n.feature-card:hover {\n  border-color: rgba(255, 255, 255, 0.15);\n  transform: translateY(-2px);\n  box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3);\n}"
  },
  {
    "path": "docs/src/pages/index.tsx",
    "content": "import { HeroSection } from \"../components/HeroSection\";\nimport { MainSystemsSection } from \"../components/MainSystemsSection\";\nimport { FeaturesSection } from \"../components/FeaturesSection\";\nimport { ScreenshotsSection, DemoSection } from \"../components/MediaSections\";\nimport { SupportSection } from \"../components/SupportSection\";\nimport { Footer, NavBar } from \"../components/Layout\";\n\nexport default function App() {\n  return (\n    <div className=\"min-h-screen bg-[#030712] text-gray-200 antialiased font-[Outfit,sans-serif]\">\n      <NavBar />\n      <main className=\"pt-16\">\n        <HeroSection />\n        <MainSystemsSection />\n        <FeaturesSection />\n        <ScreenshotsSection />\n        <DemoSection />\n        <SupportSection />\n      </main>\n      <Footer />\n    </div>\n  );\n}\n"
  },
  {
    "path": "docs/src/pages/showcase.md",
    "content": "---\n---\n\n# Showcase\n\nHere is a list of games using the Epic Online Services Godot plugin. If you are using this plugin and want to list your game in this list. Create an Issue on the [Github Repo](https://github.com/3ddelano/epic-online-services-godot/issues) with your game URL and which features of the plugin you used, or leave a message in the [Discord server](https://discord.gg/FZY9TqW).\n\n- ### Kamaeru: A Frog Refuge\n\n  Foster a sanctuary for frogs and restore the biodiversity of the wetlands in Kamaeru, a cozy frog collecting game, where you take pictures of frogs, play mini-games and decorate your habitat. Hop right to it!\n\n  Links: [Steam](https://store.epicgames.com/en-US/p/kamaeru-0c301e)\n  \n  ![Kamaeru Logo](/img/showcase/kamaeru-logo.png)\n  \n  \n  > Features Used: Achievements, Cloud Saves / PlayerDataStorage\n\n<br></br>\n\n- ### Kitchen Together\n  \n  Get ready to stir up some fun in the ultimate cooking challenge! Join your friends in this engaging multiplayer game where teamwork meets culinary creativity. Choose your kitchen role, from chopping and frying to decorating and serving, as you race against the clock to prepare delicious dishes.\n\n  Links: [Android Play Store](https://play.google.com/store/apps/details?id=com.kitchentogether) | [iOS App Store](https://apps.apple.com/us/app/kitchen-together-2/id6748915442)\n\n  ![Kitchen Together Logo](/img/showcase/kitchen-together-logo.webp)\n\n  > Features Used: Voice Chat, P2P, Lobby\n\n<br></br>\n\n- ### Hamsteria\n  \n  Hamsteria is a short (~1-2 hours) difficult two player co-op game where you're each a hamster in attached wheels. You can only spin your individual wheel forwards or backwards. There is no jump button, and there is no turn action. To escape, you must work together.\n\n  Links: [Itch.io](https://2wheelerdev.itch.io/hamsteria)\n  \n  ![Hamsteria Logo](/img/showcase/hamsteria-logo.webp)\n\n  > Features Used: P2P, Lobby"
  },
  {
    "path": "docs/src/plugins/tailwind-config.ts",
    "content": "module.exports = function tailwindPlugin(context, options) {\n\treturn {\n\t  name: 'tailwind-plugin',\n\t  configurePostCss(postcssOptions) {\n\t\tpostcssOptions.plugins = [require('@tailwindcss/postcss')]\n\t\treturn postcssOptions\n\t  }\n\t}\n  }"
  },
  {
    "path": "docs/static/.nojekyll",
    "content": ""
  },
  {
    "path": "docs/tsconfig.json",
    "content": "{\n  // This file is not used in compilation. It is here just for a nice editor experience.\n  \"extends\": \"@docusaurus/tsconfig\",\n  \"compilerOptions\": {\n    \"baseUrl\": \".\"\n  },\n  \"exclude\": [\".docusaurus\", \"build\"]\n}\n"
  },
  {
    "path": "function_analyzer.py",
    "content": "# eos_function_usage_checker.py\n\nimport os\nimport re\n\n\n# Function to extract function names from the EOS C SDK header files\ndef extract_function_names(sdk_path):\n    function_declarations = {}\n    pattern = re.compile(r\"EOS_DECLARE_FUNC\\(\\w+\\)\\s+(EOS_\\w+)\\(\")\n\n    for root, _, files in os.walk(sdk_path):\n        for file in files:\n            if file.endswith(\".h\"):\n                with open(os.path.join(root, file), 'r', encoding='utf-8') as f:\n                    content = f.read()\n                    matches = pattern.findall(content)\n                    for match in matches:\n                        function_declarations[match] = os.path.join(root, file)\n\n    return function_declarations\n\n\n# Function to search for function names in the src folder\ndef find_function_calls(src_path, function_names):\n    function_usage = {name: [] for name in function_names}\n    pattern = re.compile(r\"(\\bEOS_\\w+\\b)\")\n\n    for root, _, files in os.walk(src_path):\n        for file in files:\n            if file.endswith(\".h\") or file.endswith(\".cpp\"):\n                with open(os.path.join(root, file), 'r', encoding='utf-8') as f:\n                    content = f.read()\n                    matches = pattern.findall(content)\n                    for match in matches:\n                        if match in function_usage:\n                            function_usage[match].append(os.path.join(root, file))\n\n    return function_usage\n\n\ndef main():\n    sdk_path = 'thirdparty/eos-sdk/SDK'  # Replace with the actual path to the EOS C SDK folder\n    src_path = 'src'  # Replace with the actual path to the src folder\n\n    whitelist = ['EOS_Achievements_CopyAchievementDefinitionByIndex',\n                 'EOS_Achievements_CopyAchievementDefinitionByAchievementId',\n                 'EOS_Achievements_GetUnlockedAchievementCount',\n                 'EOS_Achievements_CopyUnlockedAchievementByIndex',\n                 'EOS_Achievements_CopyUnlockedAchievementByAchievementId',\n                 'EOS_Achievements_AddNotifyAchievementsUnlocked',\n                 'EOS_AntiCheatClient_PollStatus',\n                 'EOS_ByteArray_ToString',\n                 'EOS_EpicAccountId_IsValid',\n                 'EOS_ProductUserId_IsValid',\n                 ]\n\n    # Step 1: Extract function names from SDK header files\n    function_declarations = extract_function_names(sdk_path)\n    function_names = list(function_declarations.keys())\n    print(f\"Extracted {len(function_names)} function names from SDK headers.\")\n\n    # Step 2: Search for these function names in the src folder\n    function_usage = find_function_calls(src_path, function_names)\n\n    # Print the results\n    print(\"SDK functions not called by the plugin:\")\n    uncalled_count = 0\n    for function, files in function_usage.items():\n        if files: continue\n        if function in whitelist: continue\n        if \"RemoveNotify\" in function: continue\n\n        uncalled_count += 1\n        print(f\"{function} : {function_declarations[function]}\")\n\n    print(f\"\\nTotal number of SDK functions not called by the plugin: {uncalled_count}\")\n\n\nif __name__ == \"__main__\":\n    main()\n"
  },
  {
    "path": "sample/.gitignore",
    "content": ".import/\nexport.cfg\nexport_presets.cfg\n*.translation\n\n.godot/\n\n*.env\n*.import"
  },
  {
    "path": "sample/AntiCheatServerMain.gd",
    "content": "class_name AntiCheatServerMain\nextends Node\n\n@onready var PRODUCT_NAME: String = Env.get_var(\"PRODUCT_NAME\")\n@onready var PRODUCT_VERSION: String = Env.get_var(\"PRODUCT_VERSION\")\n@onready var PRODUCT_ID: String = Env.get_var(\"PRODUCT_ID\")\n@onready var SANDBOX_ID: String = Env.get_var(\"SANDBOX_ID\")\n@onready var DEPLOYMENT_ID: String = Env.get_var(\"DEPLOYMENT_ID\")\n@onready var CLIENT_ID: String = Env.get_var(\"CLIENT_ID\")\n@onready var CLIENT_SECRET: String = Env.get_var(\"CLIENT_SECRET\")\n@onready var ENCRYPTION_KEY: String = Env.get_var(\"ENCRYPTION_KEY\")\n\nconst PORT = 12345\n\nfunc _ready() -> void:\n\tprint(\"AntiCheatServer _ready\")\n\n\tvar init_success = await _load_and_init_sdk()\n\tif not init_success:\n\t\treturn\n\n\t_begin_session()\n\t_start_server()\n\nfunc _load_and_init_sdk() -> bool:\n\t# -----\n\t# EOS Setup\n\t# -----\n\n\t# Initialize the SDK\n\tvar init_opts = EOS.Platform.InitializeOptions.new()\n\tinit_opts.product_name = PRODUCT_NAME\n\tinit_opts.product_version = PRODUCT_VERSION\n\tvar init_res := EOS.Platform.PlatformInterface.initialize(init_opts)\n\tvar init_retry_count = 10\n\twhile not EOS.is_success(init_res) and init_retry_count > 0:\n\t\tinit_res = EOS.Platform.PlatformInterface.initialize(init_opts)\n\t\tinit_retry_count -= 1\n\t\tawait get_tree().create_timer(0.2).timeout\n\n\tif not EOS.is_success(init_res):\n\t\tprint(\"Failed to initialize EOS SDK: \", EOS.result_str(init_res))\n\t\treturn false\n\tprint(\"Initialized EOS platform\")\n\n\t# Create platform\n\tvar create_opts = EOS.Platform.CreateOptions.new()\n\tcreate_opts.product_id = PRODUCT_ID\n\tcreate_opts.sandbox_id = SANDBOX_ID\n\tcreate_opts.deployment_id = DEPLOYMENT_ID\n\tcreate_opts.client_id = CLIENT_ID\n\tcreate_opts.client_secret = CLIENT_SECRET\n\tcreate_opts.encryption_key = ENCRYPTION_KEY\n\tcreate_opts.is_server = true\n\tcreate_opts.flags = EOS.Platform.PlatformFlags.DisableOverlay\n\tvar create_success: bool = EOS.Platform.PlatformInterface.create(create_opts)\n\tvar create_retry_count = 10\n\twhile not create_success&&create_retry_count > 0:\n\t\tcreate_success = EOS.Platform.PlatformInterface.create(create_opts)\n\t\tcreate_retry_count -= 1\n\t\tawait get_tree().create_timer(0.2).timeout\n\tif not create_success:\n\t\tprint(\"Failed to create EOS Platform\")\n\t\treturn false\n\tprint(\"Created EOS platform\")\n\n\treturn true\n\nfunc _begin_session():\n\tIEOS.anticheatserver_interface_message_to_client_callback.connect(func(data):\n\t\tprint(\"--- AntiCheatServer: message_to_client_callback: \", data)\n\t)\n\n\tIEOS.anticheatserver_interface_client_action_required_callback.connect(func(data):\n\t\tprint(\"--- AntiCheatServer: client_action_required_callback: \", data)\n\t)\n\n\tIEOS.anticheatserver_interface_client_auth_status_changed_callback.connect(func(data):\n\t\tprint(\"--- AntiCheatServer: client_auth_status_changed_callback: \", data)\n\t)\n\n\tvar begin_sess_opts = EOS.AntiCheatServer.BeginSessionOptions.new()\n\tbegin_sess_opts.register_timeout_seconds = 60\n\tbegin_sess_opts.server_name = \"Godot 4.2 server\"\n\tbegin_sess_opts.enable_gameplay_data = false\n\n\tprint(\"--- AntiCheatServer: begin_session: \", EOS.AntiCheatServer.AntiCheatServerInterface.begin_session(begin_sess_opts))\n\nfunc _verify_id_token(_peer_id: int, product_user_id: String, connect_id_jwt: String):\n\tvar id_token = EOS.Connect.IdToken.new()\n\tid_token.json_web_token = connect_id_jwt\n\tid_token.product_user_id = product_user_id\n\n\tvar verify_token_opts = EOS.Connect.VerifyIdTokenOptions.new()\n\tverify_token_opts.id_token = id_token\n\n\tEOS.Connect.ConnectInterface.verify_id_token(verify_token_opts)\n\tprint(\"--- AntiCheatServer: verify_id_token: \", await IEOS.connect_interface_verify_id_token_callback)\n\nfunc _start_server():\n\tmultiplayer.peer_connected.connect(func(id: int):\n\t\tprint(\"--- AntiCheatServer:: peer_connected: \", id)\n\t)\n\tmultiplayer.peer_disconnected.connect(func(id: int):\n\t\tprint(\"--- AntiCheatServer:: peer_disconnected: \", id)\n\t)\n\n\tvar peer = ENetMultiplayerPeer.new()\n\tpeer.create_server(PORT)\n\tmultiplayer.multiplayer_peer = peer\n\tprint(\"Listening for clients on port: \", PORT)\n\nfunc on_client_message_receive(peer_id: int, type: String, data: Dictionary):\n\tif type == \"register\":\n\t\t_verify_id_token(peer_id, data.local_user_id, data.jwt)\n"
  },
  {
    "path": "sample/AntiCheatServerMain.gd.uid",
    "content": "uid://clbqhgyalkxuw\n"
  },
  {
    "path": "sample/Main.gd",
    "content": "extends Control\n\n@onready var PRODUCT_NAME: String = Env.get_var(\"PRODUCT_NAME\") # Paste your own instead of Env.get_var\n@onready var PRODUCT_VERSION: String = Env.get_var(\"PRODUCT_VERSION\") # Paste your own\n@onready var PRODUCT_ID: String = Env.get_var(\"PRODUCT_ID\") # Paste your own\n@onready var SANDBOX_ID: String = Env.get_var(\"SANDBOX_ID\") # Paste your own\n@onready var DEPLOYMENT_ID: String = Env.get_var(\"DEPLOYMENT_ID\") # Paste your own\n@onready var CLIENT_ID: String = Env.get_var(\"CLIENT_ID\") # Paste your own\n@onready var CLIENT_SECRET: String = Env.get_var(\"CLIENT_SECRET\") # Paste your own\n@onready var ENCRYPTION_KEY: String = Env.get_var(\"ENCRYPTION_KEY\") # Paste your own\n\n@export var _views_path: NodePath\n@onready var views = get_node(_views_path) as VBoxContainer\n\n\nfunc _ready() -> void:\n\tif _check_for_dedicated_server_sample():\n\t\treturn\n\tprint(\"Ready!\")\n\tStore._main_node = self\n\t\n\tHLog.log_level = HLog.LogLevel.INFO\n\n\t# -----\n\t# EOS Setup\n\t# -----\n\tvar credentials = HCredentials.new()\n\tcredentials.product_name = PRODUCT_NAME\n\tcredentials.product_version = PRODUCT_VERSION\n\tcredentials.product_id = PRODUCT_ID\n\tcredentials.sandbox_id = SANDBOX_ID\n\tcredentials.deployment_id = DEPLOYMENT_ID\n\tcredentials.client_id = CLIENT_ID\n\tcredentials.client_secret = CLIENT_SECRET\n\tcredentials.encryption_key = ENCRYPTION_KEY\n\t\n\tprint(\"Setting up EOS...\")\n\tvar setup_success := await HPlatform.setup_eos_async(credentials)\n\tif not setup_success:\n\t\tprinterr(\"Failed to setup EOS. See logs for error details\")\n\t\treturn\n\t\n\tvar sdk_constants := EOS.Version.VersionInterface.get_constants()\n\tprint(\"EOS SDK Version: %s (%s)\" % [EOS.Version.VersionInterface.get_version(), sdk_constants.copyright_string])\n\n\t# See LoginView.gd for the user login flow\n\t_parse_cmdline_user_args()\n\n\nfunc get_view_manager():\n\treturn views\n\n\nfunc _notification(what: int) -> void:\n\tif what == NOTIFICATION_WM_CLOSE_REQUEST:\n\t\tprint(\"Shutting down EOS...\")\n\t\tEOS.Platform.PlatformInterface.release()\n\t\tvar res := EOS.Platform.PlatformInterface.shutdown()\n\t\tif not EOS.is_success(res):\n\t\t\tprinterr(\"Failed to shutdown EOS: \", EOS.result_str(res))\n\n\nfunc _check_for_dedicated_server_sample() -> bool:\n\t# Ignore this method\n\t# This is for the sample project to dynamically load the\n\t# dedicated server example when certain cli flags are passed\n\t\n\tvar args = OS.get_cmdline_user_args()\n\tfor arg in args:\n\t\tif arg.begins_with(\"--screenpos=\"):\n\t\t\tvar rows = 2\n\t\t\tvar cols = 2\n\n\t\t\tvar pos := int(arg.replace(\"--screenpos=\", \"\"))\n\t\t\tvar screen_size = DisplayServer.screen_get_size()\n\n\t\t\tvar scale_x = screen_size.x / cols\n\t\t\tvar scale_y = screen_size.y / rows\n\n\t\t\tvar x = (pos - 1) % cols\n\t\t\t@warning_ignore(\"integer_division\")\n\t\t\tvar y = (pos - 1) / rows\n\n\t\t\tget_window().position = Vector2(x * scale_x, y * scale_y)\n\t\t\tget_window().size = Vector2(screen_size.x / cols, screen_size.y / rows)\n\t\n\tif \"--eosg-dedicated-server-example\" in args:\n\t\tif \"--eosg-server\" in args:\n\t\t\t_load_dedicated_server_script()\n\t\t\treturn true\n\t\tif \"--eosg-client\" in args:\n\t\t\t_load_dedicated_client_script()\n\t\t\treturn true\n\treturn false\n\n\nfunc _load_dedicated_server_script():\n\tvar SCENE := load(\"res://dedicated_server_example/server_main.tscn\") as PackedScene\n\tvar server = SCENE.instantiate()\n\tadd_child(server)\n\n\nfunc _load_dedicated_client_script():\n\tvar SCENE := load(\"res://dedicated_server_example/client_main.tscn\") as PackedScene\n\tvar client = SCENE.instantiate()\n\tadd_child(client)\n\n\nfunc _parse_cmdline_user_args():\n\tvar args = OS.get_cmdline_user_args()\n\n\n\tfor arg in args:\n\t\tif arg.begins_with(\"--devuser=\"):\n\t\t\tvar login_view = Store.get_view(\"Login\")\n\t\t\tvar username = arg.replace(\"--devuser=\", \"\")\n\t\t\tlogin_view._set_login_status(\"Logging in with devtool using cli arg...\")\n\t\t\tlogin_view._set_login_state(LoginView.States.Pending)\n\t\t\tHAuth.login_devtool_async(\"localhost:4545\", username)\n\t\t\n\t\tif arg.begins_with(\"--screenpos=\"):\n\t\t\tvar rows = 2\n\t\t\tvar cols = 2\n\n\t\t\tvar pos := int(arg.replace(\"--screenpos=\", \"\"))\n\t\t\tvar screen_size = DisplayServer.screen_get_size()\n\n\t\t\tvar scale_x = screen_size.x / cols\n\t\t\tvar scale_y = screen_size.y / rows\n\n\t\t\tvar x = (pos - 1) % cols\n\t\t\t@warning_ignore(\"integer_division\")\n\t\t\tvar y = (pos - 1) / rows\n\n\t\t\tget_window().position = Vector2(x * scale_x, y * scale_y)\n\t\t\tget_window().size = Vector2(screen_size.x / cols, screen_size.y / rows)\n"
  },
  {
    "path": "sample/Main.gd.uid",
    "content": "uid://cf8kvjx2nbysy\n"
  },
  {
    "path": "sample/Main.tscn",
    "content": "[gd_scene load_steps=25 format=3 uid=\"uid://gcoi8ld0uvkl\"]\n\n[ext_resource type=\"Theme\" uid=\"uid://dwns7wwoyi1hy\" path=\"res://components/StyledPopupWindow/StyledPopupWindowTheme.tres\" id=\"1_dhxmx\"]\n[ext_resource type=\"PackedScene\" uid=\"uid://d3hxdkoy73pf1\" path=\"res://scenes/AchievementsView/AchievementsView.tscn\" id=\"2\"]\n[ext_resource type=\"Script\" uid=\"uid://cf8kvjx2nbysy\" path=\"res://Main.gd\" id=\"3\"]\n[ext_resource type=\"Script\" uid=\"uid://b8dbhfvrewi8w\" path=\"res://scripts/ViewManager.gd\" id=\"3_j157n\"]\n[ext_resource type=\"PackedScene\" uid=\"uid://cl2qvlvdhn2iw\" path=\"res://scenes/LogsView/LogsView.tscn\" id=\"4\"]\n[ext_resource type=\"PackedScene\" uid=\"uid://bht0ln2ftshrw\" path=\"res://scenes/LoginView/LoginView.tscn\" id=\"5\"]\n[ext_resource type=\"PackedScene\" uid=\"uid://t8s6xh1ax7uy\" path=\"res://scenes/UI/PrimaryButton.tscn\" id=\"6\"]\n[ext_resource type=\"PackedScene\" uid=\"uid://d2bkej1dakv6s\" path=\"res://scenes/CustomInvitesView/CustomInvitesView.tscn\" id=\"9\"]\n[ext_resource type=\"PackedScene\" uid=\"uid://dgi7j5qx3xt84\" path=\"res://scenes/StatsView/StatsView.tscn\" id=\"10\"]\n[ext_resource type=\"PackedScene\" uid=\"uid://5xrk7nvpwosj\" path=\"res://scenes/LeaderboardsView/LeaderboardsView.tscn\" id=\"11\"]\n[ext_resource type=\"PackedScene\" uid=\"uid://t016k2yh382d\" path=\"res://scenes/FriendsView/FriendsView.tscn\" id=\"12\"]\n[ext_resource type=\"PackedScene\" uid=\"uid://b51w7a6ofuubp\" path=\"res://scenes/UIView/UIView.tscn\" id=\"13\"]\n[ext_resource type=\"PackedScene\" uid=\"uid://dsiyt23hnmngd\" path=\"res://scenes/LobbiesView/LobbiesView.tscn\" id=\"13_eyvcp\"]\n[ext_resource type=\"PackedScene\" uid=\"uid://bd06h3ufkhfd7\" path=\"res://scenes/MetricsView/MetricsView.tscn\" id=\"14\"]\n[ext_resource type=\"Script\" uid=\"uid://6tlvlmuarqub\" path=\"res://scenes/NotificationsView/NotificationsView.gd\" id=\"14_v0jrb\"]\n[ext_resource type=\"Script\" uid=\"uid://bb2nerxdrhped\" path=\"res://test.gd\" id=\"16_4rltv\"]\n[ext_resource type=\"Script\" uid=\"uid://d0vgtesnrato5\" path=\"res://scripts/network.gd\" id=\"17_ailes\"]\n[ext_resource type=\"Script\" uid=\"uid://k3lb65sounwm\" path=\"res://test_manual_audio_output.gd\" id=\"17_bg4s2\"]\n[ext_resource type=\"PackedScene\" uid=\"uid://bdlcslag0jdj1\" path=\"res://scenes/UI/nat_type.tscn\" id=\"18_vylep\"]\n[ext_resource type=\"PackedScene\" uid=\"uid://c37wtoikc8pgp\" path=\"res://scenes/UI/ping.tscn\" id=\"19_enhih\"]\n[ext_resource type=\"PackedScene\" uid=\"uid://8kmyoi08gr22\" path=\"res://scenes/UI/players_score.tscn\" id=\"20_i3cca\"]\n[ext_resource type=\"Script\" uid=\"uid://cgmpdyovn5vfm\" path=\"res://scenes/UI/touch_screen_joystick.gd\" id=\"21_5h21x\"]\n[ext_resource type=\"Script\" uid=\"uid://dygslh2f7uw40\" path=\"res://scenes/UI/joysticks.gd\" id=\"21_einjf\"]\n\n[sub_resource type=\"StyleBoxEmpty\" id=\"5\"]\n\n[node name=\"Main\" type=\"Control\"]\nlayout_mode = 3\nanchors_preset = 15\nanchor_right = 1.0\nanchor_bottom = 1.0\ngrow_horizontal = 2\ngrow_vertical = 2\ntheme = ExtResource(\"1_dhxmx\")\nscript = ExtResource(\"3\")\n_views_path = NodePath(\"MC/ViewManager\")\n\n[node name=\"ColorRect\" type=\"ColorRect\" parent=\".\"]\nlayout_mode = 0\nanchor_right = 1.0\nanchor_bottom = 1.0\ncolor = Color(0.121569, 0.121569, 0.121569, 1)\n\n[node name=\"MC\" type=\"MarginContainer\" parent=\".\"]\nlayout_mode = 0\nanchor_right = 1.0\nanchor_bottom = 1.0\ntheme_override_constants/margin_left = 8\ntheme_override_constants/margin_top = 8\ntheme_override_constants/margin_right = 8\ntheme_override_constants/margin_bottom = 8\n\n[node name=\"ViewManager\" type=\"VBoxContainer\" parent=\"MC\"]\nlayout_mode = 2\nscript = ExtResource(\"3_j157n\")\n\n[node name=\"HB\" type=\"HFlowContainer\" parent=\"MC/ViewManager\"]\nlayout_mode = 2\nsize_flags_horizontal = 3\n\n[node name=\"AuthBtn\" parent=\"MC/ViewManager/HB\" instance=ExtResource(\"6\")]\nunique_name_in_owner = true\nlayout_mode = 2\ntext = \"Auth\"\n\n[node name=\"NeedsLoginBtns\" type=\"HFlowContainer\" parent=\"MC/ViewManager/HB\"]\nunique_name_in_owner = true\nlayout_mode = 2\nsize_flags_horizontal = 3\n\n[node name=\"AchievementsBtn\" parent=\"MC/ViewManager/HB/NeedsLoginBtns\" instance=ExtResource(\"6\")]\nunique_name_in_owner = true\nlayout_mode = 2\ntext = \"Achievements\"\n\n[node name=\"CustomInvitesBtn\" parent=\"MC/ViewManager/HB/NeedsLoginBtns\" instance=ExtResource(\"6\")]\nunique_name_in_owner = true\nlayout_mode = 2\ntext = \"Custom Invites\"\n\n[node name=\"StatsBtn\" parent=\"MC/ViewManager/HB/NeedsLoginBtns\" instance=ExtResource(\"6\")]\nunique_name_in_owner = true\nlayout_mode = 2\ntext = \"Stats\"\n\n[node name=\"LeaderboardsBtn\" parent=\"MC/ViewManager/HB/NeedsLoginBtns\" instance=ExtResource(\"6\")]\nunique_name_in_owner = true\nlayout_mode = 2\ntext = \"Leaderboards\"\n\n[node name=\"FriendsBtn\" parent=\"MC/ViewManager/HB/NeedsLoginBtns\" instance=ExtResource(\"6\")]\nunique_name_in_owner = true\nlayout_mode = 2\ntext = \"Friends\"\n\n[node name=\"UIBtn\" parent=\"MC/ViewManager/HB/NeedsLoginBtns\" instance=ExtResource(\"6\")]\nunique_name_in_owner = true\nlayout_mode = 2\ntext = \"UI\"\n\n[node name=\"MetricsBtn\" parent=\"MC/ViewManager/HB/NeedsLoginBtns\" instance=ExtResource(\"6\")]\nunique_name_in_owner = true\nlayout_mode = 2\ntext = \"Metrics\"\n\n[node name=\"LobbiesBtn\" parent=\"MC/ViewManager/HB/NeedsLoginBtns\" instance=ExtResource(\"6\")]\nunique_name_in_owner = true\nlayout_mode = 2\ntext = \"Lobbies\"\n\n[node name=\"VSC\" type=\"VSplitContainer\" parent=\"MC/ViewManager\"]\nlayout_mode = 2\nsize_flags_horizontal = 3\nsize_flags_vertical = 3\ntheme_override_constants/autohide = 0\n\n[node name=\"VB\" type=\"VBoxContainer\" parent=\"MC/ViewManager/VSC\"]\nlayout_mode = 2\ntheme_override_constants/separation = 52\n\n[node name=\"LoginView\" parent=\"MC/ViewManager/VSC/VB\" instance=ExtResource(\"5\")]\ncustom_minimum_size = Vector2(0, 200)\nlayout_mode = 2\n\n[node name=\"AchievementsView\" parent=\"MC/ViewManager/VSC/VB\" instance=ExtResource(\"2\")]\nvisible = false\ncustom_minimum_size = Vector2(0, 200)\nlayout_mode = 2\n\n[node name=\"CustomInvitesView\" parent=\"MC/ViewManager/VSC/VB\" instance=ExtResource(\"9\")]\nvisible = false\ncustom_minimum_size = Vector2(0, 200)\nlayout_mode = 2\n\n[node name=\"StatsView\" parent=\"MC/ViewManager/VSC/VB\" instance=ExtResource(\"10\")]\nvisible = false\ncustom_minimum_size = Vector2(0, 200)\nlayout_mode = 2\n\n[node name=\"LeaderboardsView\" parent=\"MC/ViewManager/VSC/VB\" instance=ExtResource(\"11\")]\nvisible = false\ncustom_minimum_size = Vector2(0, 200)\nlayout_mode = 2\n\n[node name=\"FriendsView\" parent=\"MC/ViewManager/VSC/VB\" instance=ExtResource(\"12\")]\nvisible = false\ncustom_minimum_size = Vector2(0, 200)\nlayout_mode = 2\n\n[node name=\"UIView\" parent=\"MC/ViewManager/VSC/VB\" instance=ExtResource(\"13\")]\nvisible = false\ncustom_minimum_size = Vector2(0, 200)\nlayout_mode = 2\n\n[node name=\"MetricsView\" parent=\"MC/ViewManager/VSC/VB\" instance=ExtResource(\"14\")]\nvisible = false\ncustom_minimum_size = Vector2(0, 200)\nlayout_mode = 2\n\n[node name=\"LobbiesView\" parent=\"MC/ViewManager/VSC/VB\" instance=ExtResource(\"13_eyvcp\")]\nvisible = false\ncustom_minimum_size = Vector2(0, 200)\nlayout_mode = 2\n\n[node name=\"NotificationsLayer\" type=\"CanvasLayer\" parent=\"MC/ViewManager/VSC/VB\"]\n\n[node name=\"NotificationsView\" type=\"MarginContainer\" parent=\"MC/ViewManager/VSC/VB/NotificationsLayer\"]\noffset_top = 270.0\noffset_right = 366.0\noffset_bottom = 600.0\nmouse_filter = 2\nscript = ExtResource(\"14_v0jrb\")\n\n[node name=\"SC\" type=\"ScrollContainer\" parent=\"MC/ViewManager/VSC/VB/NotificationsLayer/NotificationsView\"]\ncustom_minimum_size = Vector2(350, 0)\nlayout_mode = 2\nmouse_filter = 2\n\n[node name=\"PC\" type=\"PanelContainer\" parent=\"MC/ViewManager/VSC/VB/NotificationsLayer/NotificationsView/SC\"]\nlayout_mode = 2\nsize_flags_horizontal = 3\nsize_flags_vertical = 10\nmouse_filter = 2\ntheme_override_styles/panel = SubResource(\"5\")\n\n[node name=\"MC\" type=\"MarginContainer\" parent=\"MC/ViewManager/VSC/VB/NotificationsLayer/NotificationsView/SC/PC\"]\nlayout_mode = 2\nmouse_filter = 2\ntheme_override_constants/margin_left = 4\ntheme_override_constants/margin_top = 8\ntheme_override_constants/margin_right = 4\ntheme_override_constants/margin_bottom = 8\n\n[node name=\"VB\" type=\"VBoxContainer\" parent=\"MC/ViewManager/VSC/VB/NotificationsLayer/NotificationsView/SC/PC/MC\"]\nlayout_mode = 2\nmouse_filter = 2\ntheme_override_constants/separation = 8\n\n[node name=\"LogsView\" parent=\"MC/ViewManager/VSC\" instance=ExtResource(\"4\")]\nlayout_mode = 2\n\n[node name=\"Test\" type=\"Node\" parent=\".\"]\nscript = ExtResource(\"16_4rltv\")\n\n[node name=\"ManualAudioOutput\" type=\"Node\" parent=\"Test\"]\nscript = ExtResource(\"17_bg4s2\")\n\n[node name=\"Network\" type=\"Node2D\" parent=\".\"]\nscript = ExtResource(\"17_ailes\")\n\n[node name=\"Game\" type=\"Node2D\" parent=\"Network\"]\n\n[node name=\"NetworkSpawn\" type=\"Node2D\" parent=\"Network/Game\"]\n\n[node name=\"MapSpawner\" type=\"MultiplayerSpawner\" parent=\"Network/Game\"]\n_spawnable_scenes = PackedStringArray(\"uid://d25abb5oqolnx\", \"uid://cq20ci5f675b8\", \"uid://cutu8g5suwurd\")\nspawn_path = NodePath(\"../NetworkSpawn\")\n\n[node name=\"PlayerSpawner\" type=\"MultiplayerSpawner\" parent=\"Network/Game\"]\n_spawnable_scenes = PackedStringArray(\"uid://d25l4fa1sffqk\")\nspawn_path = NodePath(\"../NetworkSpawn\")\n\n[node name=\"CanvasLayer\" type=\"CanvasLayer\" parent=\"Network/Game\"]\nvisible = false\n\n[node name=\"NatType\" parent=\"Network/Game/CanvasLayer\" instance=ExtResource(\"18_vylep\")]\noffset_left = -196.0\ntext = \"NAT TYPE: Moderate\"\n\n[node name=\"Ping\" parent=\"Network/Game/CanvasLayer\" instance=ExtResource(\"19_enhih\")]\nanchors_preset = 3\nanchor_left = 1.0\nanchor_top = 1.0\nanchor_right = 1.0\nanchor_bottom = 1.0\noffset_left = -305.0\noffset_top = -30.0\noffset_right = -213.0\noffset_bottom = -7.0\ngrow_horizontal = 0\ngrow_vertical = 0\n\n[node name=\"PlayersScore\" parent=\"Network/Game/CanvasLayer\" instance=ExtResource(\"20_i3cca\")]\n\n[node name=\"Joysticks\" type=\"Control\" parent=\"Network/Game/CanvasLayer\"]\nvisible = false\nlayout_mode = 3\nanchors_preset = 15\nanchor_right = 1.0\nanchor_bottom = 1.0\ngrow_horizontal = 2\ngrow_vertical = 2\nscript = ExtResource(\"21_einjf\")\n\n[node name=\"MoveJoystick\" type=\"Control\" parent=\"Network/Game/CanvasLayer/Joysticks\"]\nanchors_preset = 0\noffset_left = 181.0\noffset_top = 390.0\noffset_right = 221.0\noffset_bottom = 430.0\npivot_offset = Vector2(20, 20)\nscript = ExtResource(\"21_5h21x\")\nknob_color = Color(0.560955, 0.560955, 0.560955, 1)\nbase_color = Color(0.560784, 0.560784, 0.560784, 1)\nanti_aliased = true\nmode = 1\nuse_input_actions = true\naction_left = \"move_left\"\naction_right = \"move_right\"\naction_up = \"move_up\"\naction_down = \"move_down\"\n\n[node name=\"ShootJoystick\" type=\"Control\" parent=\"Network/Game/CanvasLayer/Joysticks\"]\nanchors_preset = 0\noffset_left = 938.0\noffset_top = 401.0\noffset_right = 978.0\noffset_bottom = 441.0\npivot_offset = Vector2(20, 20)\nscript = ExtResource(\"21_5h21x\")\nknob_color = Color(0.560784, 0.560784, 0.560784, 1)\nbase_color = Color(0.560784, 0.560784, 0.560784, 1)\nanti_aliased = true\nmode = 1\n"
  },
  {
    "path": "sample/addons/epic-online-services-godot/base_class.gd",
    "content": "## Copyright (c) 2022-present Delano Lourenco\n## https://github.com/3ddelano/dataclasses-godot\n## MIT License\n## See License.md\n\nclass_name BaseClass extends Dataclass\n\nfunc _init(p_name: String, p_options: Dictionary = {}):\n\tp_options[\"print_newline\"] = true\n\tp_options[\"print_exclude\"] = [\"base_class.gd\", \"_log\"]\n\tsuper._init(p_name, p_options)\n"
  },
  {
    "path": "sample/addons/epic-online-services-godot/base_class.gd.uid",
    "content": "uid://g1ij604ak57v\n"
  },
  {
    "path": "sample/addons/epic-online-services-godot/bin/.gitignore",
    "content": "*\n!.gitignore"
  },
  {
    "path": "sample/addons/epic-online-services-godot/dataclass.gd",
    "content": "## Copyright (c) 2022-present Delano Lourenco\n## https://github.com/3ddelano/dataclasses-godot\n## MIT License\n## See License.md\n\nclass_name Dataclass extends RefCounted\n\nconst __DEFAULT_OPTIONS__ = {\n\t# Whether to sort properties when printing\n\t\"sort_keys\": true,\n\n\t# Whether to include properties with null values in the to_dict() method\n\t\"include_null_in_dict\": true,\n\n\t# Whether to include properties with null values when printing\n\t\"include_null_in_print\": true,\n\n\t# Whether to print properties on newlines when printing\n\t\"print_newline\": false,\n\n\t# Names of properties to exclude when printing\n\t\"print_exclude\": []\n}\n\nconst __TYPE_STRING_CAPITAL = [\"TYPE_NIL\", \"TYPE_BOOL\", \"TYPE_INT\", \"TYPE_FLOAT\", \"TYPE_STRING\", \"TYPE_VECTOR2\", \"TYPE_VECTOR2I\", \"TYPE_RECT2\", \"TYPE_RECT2I\", \"TYPE_VECTOR3\", \"TYPE_VECTOR3I\", \"TYPE_TRANSFORM2D\", \"TYPE_VECTOR4\", \"TYPE_VECTOR4I\", \"TYPE_PLANE\", \"TYPE_QUATERNION\", \"TYPE_AABB\", \"TYPE_BASIS\", \"TYPE_TRANSFORM3D\", \"TYPE_PROJECTION\", \"TYPE_COLOR\", \"TYPE_STRING_NAME\", \"TYPE_NODE_PATH\", \"TYPE_RID\", \"TYPE_OBJECT\", \"TYPE_CALLABLE\", \"TYPE_SIGNAL\", \"TYPE_DICTIONARY\", \"TYPE_ARRAY\", \"TYPE_PACKED_BYTE_ARRAY\", \"TYPE_PACKED_INT32_ARRAY\", \"TYPE_PACKED_INT64_ARRAY\", \"TYPE_PACKED_FLOAT32_ARRAY\", \"TYPE_PACKED_FLOAT64_ARRAY\", \"TYPE_PACKED_STRING_ARRAY\", \"TYPE_PACKED_VECTOR2_ARRAY\", \"TYPE_PACKED_VECTOR3_ARRAY\", \"TYPE_PACKED_COLOR_ARRAY\", \"TYPE_MAX\"]\n\nconst __TYPE_STRING_NORMAL = [\"Nil\", \"Bool\", \"Int\", \"Float\", \"String\", \"Vector2\", \"Vector2i\", \"Rect2\", \"Rect2i\", \"Vector3\", \"Vector3i\", \"Transform2D\", \"Vector4\", \"Vector4i\", \"Plane\", \"Quaternion\", \"AABB\", \"Basis\", \"Transform3D\", \"Projection\", \"Color\", \"StringName\", \"NodePath\", \"Rid\", \"Object\", \"Callable\", \"Signal\", \"Dictionary\", \"Array\", \"PackedByteArray\", \"PackedInt32Array\", \"PackedInt64Array\", \"PackedFloat32Array\", \"PackedFloat64Array\", \"PackedStringArray\", \"PackedVector2Array\", \"PackedVector3Array\", \"PackedColorArray\", \"Max\"]\n\n\nfunc from_dict(p_dict: Dictionary):\n\tfor key in p_dict:\n\t\tif not key in self:\n\t\t\tprinterr(\"Dataclass:from_dict: Error: Key \\\"%s\\\" not found in dataclass \\\"%s\\\"\" % [key, __name__])\n\t\t\tcontinue\n\n\t\t# Check for types match\n\t\tvar typeof_expected = typeof(get(key))\n\t\tvar typeof_received = typeof(p_dict[key])\n\t\tif typeof_expected != TYPE_NIL and typeof_received != typeof_expected and (\n\t\t\t(not typeof_expected in [TYPE_INT, TYPE_FLOAT]) and\n\t\t\t(not typeof_received in [TYPE_INT, TYPE_FLOAT])\n\t\t):\n\t\t\tprinterr(\"Dataclass:from_dict: Warning: Key \\\"%s\\\" has type %s but expected type %s in dataclass \\\"%s\\\"\" % [key, __type_to_string(typeof_received), __type_to_string(typeof_expected), __name__])\n\t\tset(key, p_dict[key])\n\n\treturn self\n\n\nfunc to_dict() -> Dictionary:\n\tvar ret = {}\n\tvar all_props = __get_props()\n\tfor prop in all_props:\n\t\tvar value = get(prop.name)\n\t\tif value != null or __options__.include_null_in_dict:\n\t\t\tret[prop.name] = value\n\n\treturn ret\n\n\n\nvar __name__: String\nvar __options__: Dictionary\n\n\nfunc _init(p_name: String, p_options: Dictionary = {}):\n\t__name__ = p_name\n\t__options__ = __DEFAULT_OPTIONS__.duplicate()\n\tset_meta(\"is_dataclass\", true)\n\n\t# Override options\n\tfor key in p_options:\n\t\t__options__[key] = p_options[key]\n\n\nfunc get_class() -> String:\n\treturn __name__\n\n\nfunc __get_props() -> Array:\n\tvar all_props = get_property_list()\n\tall_props = all_props.slice(3, all_props.size() - 4)\n\n\tif __options__.sort_keys:\n\t\tall_props.sort_custom(func sort_ascending(a, b):\n\t\t\treturn a.name < b.name)\n\n\treturn all_props\n\n\nfunc __type_to_string(p_type: int, p_capital = true) -> String:\n\tif p_capital:\n\t\treturn __TYPE_STRING_CAPITAL[p_type]\n\n\treturn __TYPE_STRING_NORMAL[p_type]\n\n\nfunc __variant_to_string(value, indent_level = 0, visited_objects = []) -> String:\n\tvar type = typeof(value)\n\n\tvar newline = \"\"\n\tvar tab = \"\"\n\tvar dict_join = \", \"\n\tif __options__.print_newline:\n\t\ttab = \"\\t\"\n\t\tnewline = \"\\n\"\n\t\tdict_join = \",\\n\"\n\n\tmatch type:\n\t\tTYPE_STRING:\n\t\t\treturn \"\\\"\" + value.c_escape() + \"\\\"\"\n\t\tTYPE_NIL, TYPE_INT, TYPE_FLOAT, TYPE_BOOL:\n\t\t\treturn str(value)\n\t\tTYPE_QUATERNION, TYPE_VECTOR2, TYPE_RECT2, TYPE_VECTOR3, TYPE_TRANSFORM2D, TYPE_BASIS:\n\t\t\treturn \"%s%s\" % [__type_to_string(type, false), value]\n\t\tTYPE_RID:\n\t\t\treturn \"RID(%s)\" % value.get_id()\n\t\tTYPE_OBJECT:\n\t\t\tif value == null:\n\t\t\t\treturn \"Object(null)\"\n\t\t\telif (not value is Script) and value.has_meta(\"is_dataclass\") and value.get_meta(\"is_dataclass\"):\n\t\t\t\t# Check for circular reference to prevent infinite recursion\n\t\t\t\tif value in visited_objects:\n\t\t\t\t\treturn \"%s(<circular reference>)\" % value.__name__\n\n\t\t\t\t# Create new visited_objects array with current object added\n\t\t\t\tvisited_objects.append(value)\n\t\t\t\t\n\t\t\t\t# Manually construct the string representation to avoid calling _to_string()\n\t\t\t\tvar all_props = value.__get_props()\n\t\t\t\tvar props = PackedStringArray()\n\t\t\t\t\n\t\t\t\tfor prop in all_props:\n\t\t\t\t\tif prop.name in value.__options__.print_exclude:\n\t\t\t\t\t\tcontinue\n\t\t\t\t\tvar prop_value = value.get(prop.name)\n\t\t\t\t\tvar prop_type = typeof(prop_value)\n\t\t\t\t\tif prop_value != null or value.__options__.include_null_in_print:\n\t\t\t\t\t\tprops.append(\"%s = %s\" % [prop.name, __variant_to_string(prop_value, indent_level + 1, visited_objects)])\n\n\t\t\t\tvar separator = \", \"\n\t\t\t\tvar prop_newline = \"\"\n\t\t\t\tvar prop_newline_end = \"\"\n\t\t\t\tif value.__options__.print_newline:\n\t\t\t\t\tprop_newline = \"\\n\\t\"\n\t\t\t\t\tprop_newline_end = \"\\n\"\n\t\t\t\t\n\t\t\t\tvar result = value.__name__ + \"(\" + prop_newline + (separator + prop_newline).join(props) + prop_newline_end + \")\"\n\t\t\t\treturn result.indent(tab.repeat(indent_level)).trim_prefix(tab.repeat(indent_level))\n\n\t\t\treturn str(value)\n\t\tTYPE_DICTIONARY:\n\t\t\tvar keys = value.keys()\n\t\t\tif keys.size() == 0: return \"{}\"\n\t\t\tvar dict_string = PackedStringArray()\n\t\t\tfor key in keys:\n\t\t\t\tdict_string.append(\"%s: %s\" % [key, __variant_to_string(value[key], 0, visited_objects)])\n\n\t\t\tdict_string = \"{\" + newline + dict_join.join(dict_string).indent(tab) + newline + \"}\"\n\n\t\t\treturn dict_string.indent(tab.repeat(indent_level)).trim_prefix(tab.repeat(indent_level))\n\t\tTYPE_ARRAY, TYPE_PACKED_BYTE_ARRAY, TYPE_PACKED_INT32_ARRAY, TYPE_PACKED_INT64_ARRAY, TYPE_PACKED_FLOAT32_ARRAY, TYPE_PACKED_FLOAT64_ARRAY, TYPE_PACKED_STRING_ARRAY, TYPE_PACKED_VECTOR2_ARRAY, TYPE_PACKED_VECTOR3_ARRAY, TYPE_PACKED_COLOR_ARRAY:\n\t\t\tvar ret = PackedStringArray()\n\t\t\tfor elm in value:\n\t\t\t\tret.append(__variant_to_string(elm, 1, visited_objects))\n\t\t\tret = \"[\" + \", \".join(ret) + \"]\"\n\t\t\tif type == TYPE_ARRAY: return ret\n\n\t\t\treturn __type_to_string(type, false) + \"(\" + ret + \")\"\n\t\tTYPE_COLOR:\n\t\t\treturn \"%s%s\" % [__type_to_string(type, false), value]\n\t\t_:\n\t\t\treturn \"%s(%s)\" % [__type_to_string(type, false), value]\n\n\nfunc _to_string() -> String:\n\tvar all_props = __get_props()\n\n\tvar props = PackedStringArray()\n\tfor prop in all_props:\n\t\tif prop.name in __options__.print_exclude:\n\t\t\tcontinue\n\t\tvar value = get(prop.name)\n\t\tvar type = typeof(value)\n\t\tif value != null or __options__.include_null_in_print:\n\t\t\tprops.append(\"%s = %s\" % [prop.name, __variant_to_string(value, 1, [self])])\n\n\tvar separator = \", \"\n\tvar newline = \"\"\n\tvar newline_end = \"\"\n\tif __options__.print_newline:\n\t\tnewline = \"\\n\\t\"\n\t\tnewline_end = \"\\n\"\n\treturn __name__ + \"(\" + newline + (separator + newline).join(props) + newline_end + \")\"\n"
  },
  {
    "path": "sample/addons/epic-online-services-godot/dataclass.gd.uid",
    "content": "uid://d4hmupfn3ooqp\n"
  },
  {
    "path": "sample/addons/epic-online-services-godot/eos.gd",
    "content": "# Copyright (c) 2023-present Delano Lourenco\n# https://github.com/3ddelano/epic-online-services-godot/\n# MIT License\n\n## The main class to interact with Epic Online Services\nclass_name EOS\nextends RefCounted\n\nstatic func get_instance():\n\treturn IEOS\n\n\n## Pretty prints the [enum Result] code and its string representation.[br]\n## [code]p_result[/code] is a [enum Result] or a [Dictionary] with a [code]result_code[/code] key\nstatic func print_result(p_result) -> void:\n\tprint_rich(\"[b]EOS_Result[/b]:%s[code](%s)[/code]\" % [result_str(p_result), p_result])\n\n\n## Returns a string representation of the [enum Result] code.[br]\n## [code]p_result[/code] is a [enum Result] or a [Dictionary] with a [code]result_code[/code] key\nstatic func result_str(p_result) -> String:\n\tif typeof(p_result) == TYPE_DICTIONARY:\n\t\tp_result = p_result[\"result_code\"]\n\tvar idx := Result.values().find(p_result)\n\treturn Result.keys()[idx]\n\n\n## Returns whether the operation was completed.[br]\n## [code]p_result[/code] is a [enum Result] or a [Dictionary] with a [code]result_code[/code] key\nstatic func is_operation_complete(p_result) -> bool:\n\tif typeof(p_result) == TYPE_DICTIONARY:\n\t\tp_result = p_result[\"result_code\"]\n\treturn IEOS.is_operation_complete(p_result)\n\n\n## Returns whether the operation was successful.[br]\n## [code]p_result[/code] is a [enum Result] or a [Dictionary] with a [code]result_code[/code] key\nstatic func is_success(p_result) -> bool:\n\tif typeof(p_result) == TYPE_BOOL:\n\t\treturn p_result == true\n\tif typeof(p_result) == TYPE_DICTIONARY:\n\t\tp_result = p_result[\"result_code\"]\n\treturn p_result == Result.Success\n\n\nclass Achievements:\n\tconst UNLOCK_TIME_UNDEFINED = -1\n\n\tclass CopyAchievementDefinitionV2ByAchievementIdOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"CopyAchievementDefinitionV2ByAchievementIdOptions\")\n\n\t\tvar achievement_id: String\n\n\tclass CopyAchievementDefinitionV2ByIndexOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"CopyAchievementDefinitionV2ByIndexOptions\")\n\n\t\tvar achievement_index: int\n\n\tclass CopyPlayerAchievementByAchievementIdOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"CopyPlayerAchievementByAchievementIdOptions\")\n\n\t\tvar achievement_id: String\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar target_user_id = EOSGRuntime.local_product_user_id\n\n\tclass CopyPlayerAchievementByIndexOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"CopyPlayerAchievementByIndexOptions\")\n\n\t\tvar achievement_index: int\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar target_user_id: String\n\n\tclass GetAchievementDefinitionCountOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"GetAchievementDefinitionCountOptions\")\n\n\tclass QueryDefinitionsOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"QueryDefinitionsOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\n\t\tvar client_data = null\n\n\tclass GetPlayerAchievementCountOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"GetPlayerAchievementCountOptions\")\n\n\t\tvar user_id: String\n\n\tclass QueryPlayerAchievementsOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"QueryPlayerAchievementsOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar target_user_id = EOSGRuntime.local_product_user_id\n\n\t\tvar client_data = null\n\n\tclass UnlockAchievementsOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"UnlockAchievementsOptions\")\n\n\t\tvar user_id: String\n\t\tvar achievement_ids: Array # Array[String]\n\t\tvar client_data = null\n\n\tclass AchievementsInterface:\n\t\tstatic func query_definitions(options: QueryDefinitionsOptions) -> void:\n\t\t\tIEOS.achievements_interface_query_definitions(options)\n\n\t\tstatic func get_achievement_definition_count(options: GetAchievementDefinitionCountOptions) -> int:\n\t\t\treturn IEOS.achievements_interface_get_achievement_definition_count(options)\n\n\t\tstatic func copy_achievement_definition_v2_by_achievement_id(\n\t\t\toptions: CopyAchievementDefinitionV2ByAchievementIdOptions\n\t\t) -> Dictionary:\n\t\t\treturn IEOS.achievements_interface_copy_achievement_definition_v2_by_achievement_id(\n\t\t\t\toptions\n\t\t\t)\n\n\t\tstatic func copy_achievement_definition_v2_by_index(\n\t\t\toptions: CopyAchievementDefinitionV2ByIndexOptions\n\t\t) -> Dictionary:\n\t\t\treturn IEOS.achievements_interface_copy_achievement_definition_v2_by_index(options)\n\n\t\tstatic func query_player_achievements(options: QueryPlayerAchievementsOptions) -> void:\n\t\t\tIEOS.achievements_interface_query_player_achievements(options)\n\n\t\tstatic func get_player_achievement_count(options: GetPlayerAchievementCountOptions) -> int:\n\t\t\treturn IEOS.achievements_interface_get_player_achievement_count(options)\n\n\t\tstatic func copy_player_achievement_by_achievement_id(\n\t\t\toptions: CopyPlayerAchievementByAchievementIdOptions\n\t\t) -> Dictionary:\n\t\t\treturn IEOS.achievements_interface_copy_player_achievement_by_achievement_id(options)\n\n\t\tstatic func copy_player_achievement_by_index(options: CopyPlayerAchievementByIndexOptions) -> Dictionary:\n\t\t\treturn IEOS.achievements_interface_copy_player_achievement_by_index(options)\n\n\t\tstatic func unlock_achievements(options: UnlockAchievementsOptions) -> void:\n\t\t\tIEOS.achievements_interface_unlock_achievements(options)\n\n\n\nclass Connect:\n\tconst CONNECT_TIME_UNDEFINED = -1\n\t\n\tclass Credentials extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"Credentials\")\n\n\t\tvar type: ExternalCredentialType = -1\n\t\tvar token = null\n\n\tclass UserLoginInfo extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"UserLoginInfo\")\n\n\t\tvar display_name: String\n\t\tvar nsa_id_token: String\n\n\tclass LoginOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"LoginOptions\")\n\n\t\tvar credentials: Credentials\n\t\tvar user_login_info: UserLoginInfo\n\n\t\tvar client_data = null\n\n\tclass LogoutOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"LogoutOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\n\t\tvar client_data = null\n\n\tclass CopyIdTokenOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"CopyIdTokenOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\n\tclass CopyProductUserExternalAccountByAccountIdOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"CopyProductUserExternalAccountByAccountIdOptions\")\n\n\t\tvar target_user_id = EOSGRuntime.local_product_user_id\n\t\tvar account_id: String\n\n\tclass CopyProductUserExternalAccountByAccountTypeOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"CopyProductUserExternalAccountByAccountTypeOptions\")\n\n\t\tvar target_user_id = EOSGRuntime.local_product_user_id\n\t\tvar account_id_type: ExternalAccountType\n\n\tclass CopyProductUserExternalAccountByIndexOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"CopyProductUserExternalAccountByIndexOptions\")\n\n\t\tvar target_user_id = EOSGRuntime.local_product_user_id\n\t\tvar external_account_info_index: int\n\n\tclass CopyProductUserInfoOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"CopyProductUserInfoOptions\")\n\n\t\tvar target_user_id = EOSGRuntime.local_product_user_id\n\n\tclass CreateDeviceIdOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"CreateDeviceIdOptions\")\n\n\t\tvar device_model: String\n\n\t\tvar client_data = null\n\n\tclass DeleteDeviceIdOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"DeleteDeviceIdOptions\")\n\n\t\tvar client_data = null\n\n\tclass CreateUserOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"CreateUserOptions\")\n\n\t\tvar continuance_token: EOSGContinuanceToken\n\n\t\tvar client_data = null\n\n\tclass QueryExternalAccountMappingsOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"QueryExternalAccountMappingsOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar account_id_type: ExternalAccountType\n\t\tvar external_account_ids: Array # Array[String]\n\n\tclass GetExternalAccountMappingsOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"GetExternalAccountMappingsOptions\")\n\n\t\tvar account_id_type: ExternalAccountType\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar target_external_user_id: String\n\n\tclass GetProductUserExternalAccountCountOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"GetProductUserExternalAccountCountOptions\")\n\n\t\tvar target_user_id = EOSGRuntime.local_product_user_id\n\n\tclass QueryProductUserIdMappingsOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"QueryProductUserIdMappingsOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar product_user_ids: Array # Array[String]\n\n\tclass GetProductUserIdMappingOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"GetProductUserIdMappingOptions\")\n\n\t\tvar account_id_type: ExternalAccountType\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar target_product_user_id = EOSGRuntime.local_product_user_id\n\n\tclass LinkAccountOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"LinkAccountOptions\")\n\n\t\tvar continuance_token = null # ContinuanceTokenWrapper\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\n\t\tvar client_data = null\n\n\tclass IdToken extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"IdToken\")\n\n\t\tvar product_user_id: String\n\t\tvar json_web_token: String\n\n\tclass VerifyIdTokenOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"VerifyIdTokenOptions\")\n\n\t\tvar id_token: IdToken\n\n\t\tvar client_data = null\n\n\tclass TransferDeviceIdAccountOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"TransferDeviceIdAccountOptions\")\n\n\t\tvar primary_local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar local_device_user_id = EOSGRuntime.local_product_user_id\n\t\tvar product_user_id_to_preserve: String\n\n\t\tvar client_data = null\n\n\tclass UnlinkAccountOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"UnlinkAccountOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\n\t\tvar client_data = null\n\n\tclass ConnectInterface:\n\t\tstatic func login(options: LoginOptions) -> void:\n\t\t\tIEOS.connect_interface_login(options)\n\n\t\tstatic func logout(options: LogoutOptions) -> void:\n\t\t\tIEOS.connect_interface_logout(options)\n\n\t\tstatic func copy_id_token(options: CopyIdTokenOptions) -> Dictionary:\n\t\t\treturn IEOS.connect_interface_copy_id_token(options)\n\n\t\tstatic func copy_product_user_external_account_by_account_id(options: CopyProductUserExternalAccountByAccountIdOptions) -> Dictionary:\n\t\t\treturn IEOS.connect_interface_copy_product_user_external_account_by_account_id(options)\n\n\t\tstatic func copy_product_user_external_account_by_account_type(options: CopyProductUserExternalAccountByAccountTypeOptions) -> Dictionary:\n\t\t\treturn IEOS.connect_interface_copy_product_user_external_account_by_account_type(options)\n\n\t\tstatic func copy_product_user_external_account_by_index(options: CopyProductUserExternalAccountByIndexOptions) -> Dictionary:\n\t\t\treturn IEOS.connect_interface_copy_product_user_external_account_by_index(options)\n\n\t\tstatic func copy_product_user_info(options: CopyProductUserInfoOptions) -> Dictionary:\n\t\t\treturn IEOS.connect_interface_copy_product_user_info(options)\n\n\t\tstatic func create_device_id(options: CreateDeviceIdOptions) -> void:\n\t\t\tIEOS.connect_interface_create_device_id(options)\n\n\t\tstatic func create_user(options: CreateUserOptions) -> void:\n\t\t\tIEOS.connect_interface_create_user(options)\n\n\t\tstatic func delete_device_id(options: DeleteDeviceIdOptions) -> void:\n\t\t\tIEOS.connect_interface_delete_device_id(options)\n\n\t\tstatic func query_external_account_mappings(options: QueryExternalAccountMappingsOptions) -> void:\n\t\t\tIEOS.connect_interface_query_external_account_mappings(options)\n\n\t\tstatic func get_external_account_mapping(options: GetExternalAccountMappingsOptions) -> String:\n\t\t\treturn IEOS.connect_interface_get_external_account_mapping(options)\n\n\t\tstatic func get_logged_in_user_by_index(index: int) -> String:\n\t\t\treturn IEOS.connect_interface_get_logged_in_user_by_index(index)\n\n\t\tstatic func get_logged_in_users_count() -> int:\n\t\t\treturn IEOS.connect_interface_get_logged_in_users_count()\n\n\t\tstatic func get_login_status(local_user_id := EOSGRuntime.local_product_user_id) -> LoginStatus:\n\t\t\treturn IEOS.connect_interface_get_login_status(local_user_id)\n\n\t\tstatic func get_product_user_external_account_count(options: GetProductUserExternalAccountCountOptions = GetProductUserExternalAccountCountOptions.new()) -> int:\n\t\t\treturn IEOS.connect_interface_get_product_user_external_account_count(options)\n\n\t\tstatic func query_product_user_id_mappings(options: QueryProductUserIdMappingsOptions) -> void:\n\t\t\tIEOS.connect_interface_query_product_user_id_mappings(options)\n\n\t\tstatic func get_product_user_id_mapping(options: GetProductUserIdMappingOptions) -> Dictionary:\n\t\t\treturn IEOS.connect_interface_get_product_user_id_mapping(options)\n\n\t\tstatic func link_account(options: LinkAccountOptions) -> void:\n\t\t\tIEOS.connect_interface_link_account(options)\n\n\t\tstatic func verify_id_token(options: VerifyIdTokenOptions) -> void:\n\t\t\tIEOS.connect_interface_verify_id_token(options)\n\n\t\tstatic func transfer_device_id_account(options: TransferDeviceIdAccountOptions) -> void:\n\t\t\tIEOS.connect_interface_transfer_device_id_account(options)\n\n\t\tstatic func unlink_account(options: UnlinkAccountOptions) -> void:\n\t\t\tIEOS.connect_interface_unlink_account(options)\n\n\n\nclass Auth:\n\tenum ScopeFlags {\n\t\tNoFlags = 0x0,\n\t\tBasicProfile = 0x1,\n\t\tFriendsList = 0x2,\n\t\tPresence = 0x4,\n\t\tFriendsManagement = 0x8,\n\t\tEmail = 0x10,\n\t\tCountry = 0x20,\n\t}\n\n\tenum AuthTokenType {Client = 0, User = 1}\n\n\tenum LinkAccountFlags {NoFlags = 0x0, NintendoNsaId = 0x1}\n\n\tenum LoginCredentialType {\n\t\tNone = -1,\n\t\tPassword = 0,\n\t\tExchangeCode = 1,\n\t\tPersistentAuth = 2,\n\t\tDeviceCode = 3,\n\t\tDeveloper = 4,\n\t\tRefreshToken = 5,\n\t\tAccountPortal = 6,\n\t\tExternalAuth = 7\n\t}\n\n\tenum LoginFlags {\n\t\tNone = 0,\n\t\tNoUserInterface = 1\n\t}\n\n\tclass Credentials extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"Credentials\")\n\n\t\tvar external_type: ExternalCredentialType = -1\n\t\tvar id: String\n\t\tvar token: String\n\t\tvar type: LoginCredentialType = -1\n\n\tclass LoginOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"LoginOptions\")\n\n\t\tvar credentials: Credentials\n\t\tvar login_flags: LoginFlags = LoginFlags.None\n\t\tvar scope_flags: ScopeFlags = ScopeFlags.NoFlags\n\n\t\tvar client_data = null\n\n\tclass LogoutOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"LogoutOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_epic_account_id\n\n\t\tvar client_data = null\n\n\tclass CopyIdTokenOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"CopyIdTokenOptions\")\n\n\t\tvar account_id = EOSGRuntime.local_epic_account_id\n\n\tclass CopyUserAuthTokenOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"CopyUserAuthTokenOptions\")\n\n\tclass DeletePersistentAuthOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"DeletePersistentAuthOptions\")\n\n\t\tvar refresh_token = null\n\n\t\tvar client_data = null\n\n\tclass LinkAccountOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"LinkAccountOptions\")\n\n\t\tvar continuance_token: EOSGContinuanceToken\n\t\tvar link_account_flags: LinkAccountFlags = LinkAccountFlags.NoFlags\n\t\tvar local_user_id = EOSGRuntime.local_epic_account_id\n\n\t\tvar client_data = null\n\n\tclass QueryIdTokenOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"QueryIdTokenOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_epic_account_id\n\t\tvar target_account_id = EOSGRuntime.local_epic_account_id\n\n\t\tvar client_data = null\n\n\tclass IdToken extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"IdToken\")\n\n\t\tvar account_id: String\n\t\tvar json_web_token: String\n\n\tclass VerifyIdTokenOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"VerifyIdTokenOptions\")\n\n\t\tvar id_token: IdToken\n\n\t\tvar client_data = null\n\n\tclass Token extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"Token\")\n\n\t\tvar access_token: String\n\t\tvar account_id: String\n\t\tvar app: String\n\t\tvar auth_type: int\n\t\tvar client_id: String\n\t\tvar expires_at: String\n\t\tvar expires_in: float\n\t\tvar refresh_expires_at: String\n\t\tvar refresh_expires_in: float\n\t\tvar refresh_token: String\n\n\tclass VerifyUserAuthOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"VerifyUserAuthOptions\")\n\n\t\tvar auth_token: Token\n\n\t\tvar client_data = null\n\n\tclass AuthInterface:\n\t\tstatic func login(options: LoginOptions) -> void:\n\t\t\tIEOS.auth_interface_login(options)\n\n\t\tstatic func logout(options: LogoutOptions) -> void:\n\t\t\tIEOS.auth_interface_logout(options)\n\n\t\tstatic func copy_id_token(options: CopyIdTokenOptions) -> Dictionary:\n\t\t\treturn IEOS.auth_interface_copy_id_token(options)\n\n\t\tstatic func copy_user_auth_token(options: CopyUserAuthTokenOptions, local_user_id := EOSGRuntime.local_epic_account_id) -> Dictionary:\n\t\t\tvar func_result: Dictionary = IEOS.auth_interface_copy_user_auth_token(\n\t\t\t\toptions, local_user_id\n\t\t\t)\n\t\t\tvar token: Token = Token.new()\n\t\t\tif func_result.token:\n\t\t\t\tvar token_dict = func_result.token\n\t\t\t\ttoken.access_token = token_dict.access_token\n\t\t\t\ttoken.account_id = token_dict.account_id\n\t\t\t\ttoken.app = token_dict.app\n\t\t\t\ttoken.auth_type = token_dict.auth_type\n\t\t\t\ttoken.client_id = token_dict.client_id\n\t\t\t\ttoken.expires_at = token_dict.expires_at\n\t\t\t\ttoken.expires_in = token_dict.expires_in\n\t\t\t\ttoken.refresh_expires_at = token_dict.refresh_expires_at\n\t\t\t\ttoken.refresh_expires_in = token_dict.refresh_expires_in\n\t\t\t\ttoken.refresh_token = token_dict.refresh_token\n\n\t\t\treturn {result_code = func_result.result_code, token = token}\n\n\t\tstatic func delete_persistent_auth(options: DeletePersistentAuthOptions) -> void:\n\t\t\tIEOS.auth_interface_delete_persistent_auth(options)\n\n\t\tstatic func get_logged_in_account_by_index(index: int) -> String:\n\t\t\treturn IEOS.auth_interface_get_logged_in_account_by_index(index)\n\n\t\tstatic func get_logged_in_accounts_count() -> int:\n\t\t\treturn IEOS.auth_interface_get_logged_in_accounts_count()\n\n\t\tstatic func get_login_status(local_user_id := EOSGRuntime.local_epic_account_id) -> LoginStatus:\n\t\t\treturn IEOS.auth_interface_get_login_status(local_user_id)\n\n\t\tstatic func get_merged_account_by_index(local_user_id: String, index: int) -> String:\n\t\t\treturn IEOS.auth_interface_get_merged_account_by_index(local_user_id, index)\n\n\t\tstatic func get_merged_accounts_count(local_user_id := EOSGRuntime.local_epic_account_id) -> int:\n\t\t\treturn IEOS.auth_interface_get_merged_accounts_count(local_user_id)\n\n\t\tstatic func get_selected_account_id(local_user_id := EOSGRuntime.local_epic_account_id) -> Dictionary:\n\t\t\treturn IEOS.auth_interface_get_selected_account_id(local_user_id)\n\n\t\tstatic func link_account(options: LinkAccountOptions) -> void:\n\t\t\tIEOS.auth_interface_link_account(options)\n\n\t\tstatic func query_id_token(options: QueryIdTokenOptions) -> void:\n\t\t\tIEOS.auth_interface_query_id_token(options)\n\n\t\tstatic func verify_id_token(options: VerifyIdTokenOptions) -> void:\n\t\t\tIEOS.auth_interface_verify_id_token(options)\n\n\t\tstatic func verify_user_auth(options: VerifyUserAuthOptions) -> void:\n\t\t\tIEOS.auth_interface_verify_user_auth(options)\n\n\n\nclass CustomInvites:\n\tenum ResquestToJoinResponse {\n\t\tAccepted = 0,\n\t\tRejected = 1,\n\t}\n\n\tclass SetCustomInviteOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"SetCustomInviteOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar payload: String\n\n\tclass SendCustomInviteOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"SendCustomInviteOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar target_user_ids: Array # Array[String]\n\n\t\tvar client_data = null\n\n\tclass FinalizeInviteOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"FinalizeInviteOptions\")\n\n\t\tvar custom_invite_id: String\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar processing_result: Result\n\t\tvar target_user_id: String\n\n\tclass SendRequestToJoinOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"SendRequestToJoinOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar target_user_id: String\n\n\t\tvar client_data = null\n\n\tclass AcceptRequestToJoinOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"AcceptRequestToJoinOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar target_user_id: String\n\n\t\tvar client_data = null\n\n\tclass RejectRequestToJoinOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"RejectRequestToJoinOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar target_user_id: String\n\n\t\tvar client_data = null\n\n\tclass CustomInvitesInterface:\n\t\tstatic func set_custom_invite(options: SetCustomInviteOptions) -> Result:\n\t\t\treturn IEOS.custom_invites_interface_set_custom_invite(options)\n\n\t\tstatic func send_custom_invite(options: SendCustomInviteOptions) -> void:\n\t\t\tIEOS.custom_invites_interface_send_custom_invite(options)\n\n\t\tstatic func finalize_invite(options: FinalizeInviteOptions) -> Result:\n\t\t\treturn IEOS.custom_invites_interface_finalize_invite(options)\n\n\t\tstatic func send_request_to_join(options: SendRequestToJoinOptions) -> void:\n\t\t\tIEOS.custom_invites_interface_send_request_to_join(options)\n\n\t\tstatic func accept_request_to_join(options: SendRequestToJoinOptions) -> void:\n\t\t\tIEOS.custom_invites_interface_accept_request_to_join(options)\n\n\t\tstatic func reject_request_to_join(options: SendRequestToJoinOptions) -> void:\n\t\t\tIEOS.custom_invites_interface_reject_request_to_join(options)\n\n\n\nclass Stats:\n\tconst STATS_TIME_UNDEFINED = -1\n\n\tclass CopyStatByIndexOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"CopyStatByIndexOptions\")\n\n\t\tvar target_user_id = EOSGRuntime.local_product_user_id\n\t\tvar stat_index: int\n\n\tclass CopyStatByNameOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"CopyStatByNameOptions\")\n\n\t\tvar target_user_id = EOSGRuntime.local_product_user_id\n\t\tvar name: String\n\n\tclass GetStatsCountOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"GetStatsCountOptions\")\n\n\t\tvar target_user_id = EOSGRuntime.local_product_user_id\n\n\tclass IngestStatOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"IngestStatOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar stats: Array # Array[Dictionary] {stat_name: String, ingest_amount: int}\n\t\tvar target_user_id = EOSGRuntime.local_product_user_id\n\n\t\tvar client_data = null\n\n\tclass QueryStatsOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"QueryStatsOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar target_user_id = EOSGRuntime.local_product_user_id\n\t\tvar stat_names: Array # Array[String]\n\t\tvar start_time = STATS_TIME_UNDEFINED\n\t\tvar end_time = STATS_TIME_UNDEFINED\n\n\t\tvar client_data = null\n\n\tclass StatsInterface:\n\t\tstatic func copy_stat_by_index(options: CopyStatByIndexOptions) -> Dictionary:\n\t\t\treturn IEOS.stats_interface_copy_stat_by_index(options)\n\n\t\tstatic func copy_stat_by_name(options: CopyStatByNameOptions) -> Dictionary:\n\t\t\treturn IEOS.stats_interface_copy_stat_by_name(options)\n\n\t\tstatic func get_stats_count(options: GetStatsCountOptions) -> int:\n\t\t\treturn IEOS.stats_interface_get_stats_count(options)\n\n\t\tstatic func ingest_stat(options: IngestStatOptions) -> void:\n\t\t\tIEOS.stats_interface_ingest_stat(options)\n\n\t\tstatic func query_stats(options: QueryStatsOptions) -> void:\n\t\t\tIEOS.stats_interface_query_stats(options)\n\n\n\nclass Platform:\n\tenum PlatformFlags {\n\t\tNone = 0x0,\n\t\tLoadingInEditor = 0x00001,\n\t\tDisableOverlay = 0x00002,\n\t\tDisableSocialOverlay = 0x00004,\n\t\tReserved1 = 0x00008,\n\t\tWindowsEnableOverlayD3D9 = 0x00010,\n\t\tWindowsEnableOverlayD3D10 = 0x00020,\n\t\tWindowsEnableOverlayOpengl = 0x00040,\n\t\tConsoleEnableOverlayAutomaticUnloading = 0x00080,\n\t}\n\n\tenum ApplicationStatus {\n\t\tBackgroundConstrained = 0,\n\t\tBackgroundUnconstrained = 1,\n\t\tBackgroundSuspended = 2,\n\t\tForeground = 3\n\t}\n\n\tenum NetworkStatus {\n\t\tDisabled = 0,\n\t\tOffline = 1,\n\t\tOnline = 2\n\t}\n\n\tenum DesktopCrossplayStatus {\n\t\tOK = 0,\n\t\tApplicationNotBootstrapped = 1,\n\t\tServiceNotInstalled = 2,\n\t\tServiceStartFailed = 3,\n\t\tServiceNotRunning = 4,\n\t\tOverlayDisabled = 5,\n\t\tOverlayNotInstalled = 6,\n\t\tOverlayTrustCheckFailed = 7,\n\t\tOverlayLoadFailed = 8\n\t}\n\n\tenum RTCBackgroundMode {\n\t\tLeaveRooms = 0,\n\t\tKeepRoomsAlive = 1,\n\t}\n\n\tclass InitializeOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"InitializeOptions\")\n\n\t\tvar product_name: String\n\t\tvar product_version: String\n\n\tclass RTCOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"RTCOptions\")\n\n\t\tvar background_mode = null ## See [enum EOS.Platform.RTCBackgroundMode]\n\n\tclass CreateOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"CreateOptions\")\n\n\t\tvar client_id: String\n\t\tvar client_secret: String\n\t\tvar deployment_id: String\n\t\tvar encryption_key: String\n\t\tvar product_id: String\n\t\tvar sandbox_id: String\n\n\t\tvar cache_directory = ProjectSettings.globalize_path(\"user://eosg-cache\")\n\t\tvar flags: int = 0 ## See [enum EOS.Platform.PlatformFlags]\n\t\tvar is_server: bool\n\t\tvar override_country_code: String\n\t\tvar override_locale_code: String\n\t\tvar tick_budget_in_milliseconds: int\n\t\tvar task_network_timeout_seconds = null # float\n\n\t\tvar rtc_options := RTCOptions.new()\n\n\tclass PlatformInterface:\n\t\tstatic func create(options: CreateOptions) -> bool:\n\t\t\treturn IEOS.platform_interface_create(options)\n\n\t\tstatic func get_active_country_code(user_id: String) -> Dictionary:\n\t\t\treturn IEOS.platform_interface_get_active_country_code(user_id)\n\n\t\tstatic func get_active_locale_code(user_id: String) -> Dictionary:\n\t\t\treturn IEOS.platform_interface_get_active_locale_code(user_id)\n\n\t\tstatic func get_override_country_code() -> Dictionary:\n\t\t\treturn IEOS.platform_interface_get_override_country_code()\n\n\t\tstatic func get_override_locale_code() -> Dictionary:\n\t\t\treturn IEOS.platform_interface_get_override_locale_code()\n\n\t\tstatic func set_override_country_code(country_code: String) -> Result:\n\t\t\treturn IEOS.platform_interface_set_override_country_code(country_code)\n\n\t\tstatic func set_override_locale_code(locale_code: String) -> Result:\n\t\t\treturn IEOS.platform_interface_set_override_locale_code(locale_code)\n\n\t\tstatic func check_for_launcher_and_restart() -> Result:\n\t\t\treturn IEOS.platform_interface_check_for_launcher_and_restart()\n\n\t\tstatic func initialize(options: InitializeOptions) -> Result:\n\t\t\treturn IEOS.platform_interface_initialize(options)\n\n\t\tstatic func get_desktop_crossplay_status_info() -> Dictionary:\n\t\t\treturn IEOS.platform_interface_get_desktop_crossplay_status_info()\n\n\t\tstatic func set_application_status(status: ApplicationStatus) -> Result:\n\t\t\treturn IEOS.platform_interface_set_application_status(status)\n\n\t\tstatic func get_application_status() -> ApplicationStatus:\n\t\t\treturn IEOS.platform_interface_get_application_status()\n\n\t\tstatic func set_network_status(status: NetworkStatus) -> Result:\n\t\t\treturn IEOS.platform_interface_set_network_status(status)\n\n\t\tstatic func get_network_status() -> NetworkStatus:\n\t\t\treturn IEOS.platform_interface_get_network_status()\n\n\t\tstatic func release() -> void:\n\t\t\tIEOS.platform_interface_release()\n\n\t\tstatic func shutdown() -> Result:\n\t\t\treturn IEOS.platform_interface_shutdown()\n\n\n\nclass Ecom:\n\tenum ItemType { \n\t\t## This entitlement is intended to persist.\n\t\tDurable = 0,\n\t\t## This entitlement is intended to be transient and redeemed.\n\t\tConsumable = 1,\n\t\t## This entitlement has a type that is not currently intended for an in-game store.\n\t\tOther = 2\n\t}\n\n\tenum OwnershipStatus {\n\t\t## The catalog item is not owned by the local user\n\t\tNotOwned = 0,\n\t\t## The catalog item is owned by the local user\n\t\tOwned = 1\n\t}\n\n\tenum CheckoutOrientation {\n\t\t## Current orientation will be used\n\t\tDefault = 0,\n\t\t## Portrait orientation\n\t\tPortrait = 1,\n\t\t## Landscape orientation\n\t\tLandscape = 2\n\t}\n\n\tclass CheckoutOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"CheckoutOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_epic_account_id\n\t\tvar entries: Array # Array[Dictionary] {offer_id: String}\n\t\tvar override_catalog_namespace: String\n\t\tvar preferred_orientation = CheckoutOrientation.Default\n\n\tclass CopyEntitlementByIdOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"CopyEntitlementByIdOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_epic_account_id\n\t\tvar entitlement_id: String\n\n\tclass CopyEntitlementByIndexOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"CopyEntitlementByIndexOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_epic_account_id\n\t\tvar entitlement_index: int\n\n\tclass CopyEntitlementByNameAndIndexOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"CopyEntitlementByNameAndIndexOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_epic_account_id\n\t\tvar entitlement_name: String\n\t\tvar index: int\n\n\tclass CopyItemByIdOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"CopyItemByIdOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_epic_account_id\n\t\tvar item_id: String\n\n\tclass CopyItemImageInfoByIndexOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"CopyItemImageInfoByIndexOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_epic_account_id\n\t\tvar item_id: String\n\t\tvar image_info_index: int\n\n\tclass CopyItemReleaseByIndexOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"CopyItemReleaseByIndexOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_epic_account_id\n\t\tvar item_id: String\n\t\tvar release_index: int\n\n\tclass CopyOfferByIdOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"CopyOfferByIdOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_epic_account_id\n\t\tvar offer_id: String\n\n\tclass CopyOfferByIndexOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"CopyOfferByIndexOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_epic_account_id\n\t\tvar offer_index: int\n\n\tclass CopyOfferImageInfoByIndexOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"CopyOfferImageInfoByIndexOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_epic_account_id\n\t\tvar offer_id: String\n\t\tvar image_info_index: int\n\n\tclass CopyOfferItemByIndexOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"CopyOfferItemByIndexOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_epic_account_id\n\t\tvar offer_id: String\n\t\tvar item_index: int\n\n\tclass CopyTransactionByIdOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"CopyTransactionByIdOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_epic_account_id\n\t\tvar transaction_id: String\n\n\tclass CopyTransactionByIndexOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"CopyTransactionByIndexOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_epic_account_id\n\t\tvar transaction_index: int\n\n\tclass GetEntitlementsByNameCountOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"GetEntitlementsByNameCountOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_epic_account_id\n\t\tvar entitlement_name: String\n\n\tclass GetEntitlementsCountOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"GetEntitlementsCountOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_epic_account_id\n\t\tvar item_id: String\n\n\tclass GetItemImageInfoCountOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"GetItemImageInfoCountOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_epic_account_id\n\t\tvar item_id: String\n\n\tclass GetItemReleaseCountOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"GetItemReleaseCountOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_epic_account_id\n\t\tvar item_id: String\n\n\tclass GetOfferCountOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"GetOfferCountOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_epic_account_id\n\n\tclass GetOfferImageInfoCountOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"GetOfferImageInfoCountOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_epic_account_id\n\t\tvar offer_id: String\n\n\tclass GetOfferItemCountOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"GetOfferItemCountOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_epic_account_id\n\t\tvar offer_id: String\n\n\tclass GetTransactionCountOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"GetTransactionCountOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_epic_account_id\n\n\tclass QueryEntitlementsOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"QueryEntitlementsOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_epic_account_id\n\t\tvar entitlement_names: Array # Array[String]\n\t\tvar include_redeemed: bool\n\t\tvar override_catalog_namespace: String\n\n\tclass QueryOffersOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"QueryOffersOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_epic_account_id\n\t\tvar override_catalog_namespace: String\n\n\t\tvar client_data = null\n\n\tclass QueryOwnershipOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"QueryOwnershipOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_epic_account_id\n\t\tvar catalog_item_ids: Array # Array[String]\n\t\tvar catalog_namespace: String\n\n\t\tvar client_data = null\n\n\tclass QueryOwnershipTokenOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"QueryOwnershipTokenOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_epic_account_id\n\t\tvar catalog_item_ids: Array # Array[String]\n\t\tvar catalog_namespace = null # String\n\n\t\tvar client_data = null\n\n\tclass RedeemEntitlementsOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"RedeemEntitlementsOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_epic_account_id\n\t\tvar entitlement_ids: Array # Array[String]\n\n\t\tvar client_data = null\n\n\tclass GetLastRedeemedEntitlementsCountOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"GetLastRedeemedEntitlementsCountOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_epic_account_id\n\n\tclass CopyLastRedeemedEntitlementByIndexOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"CopyLastRedeemedEntitlementByIndexOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_epic_account_id\n\t\tvar redeemed_entitlement_index: String\n\n\tclass EcomInterface:\n\t\tstatic func checkout(options: CheckoutOptions) -> void:\n\t\t\tIEOS.ecom_interface_checkout(options)\n\n\t\tstatic func copy_entitlement_by_id(options: CopyEntitlementByIdOptions) -> Dictionary:\n\t\t\treturn IEOS.ecom_interface_copy_entitlement_by_id(options)\n\n\t\tstatic func copy_entitlement_by_index(options: CopyEntitlementByIndexOptions) -> Dictionary:\n\t\t\treturn IEOS.ecom_interface_copy_entitlement_by_index(options)\n\n\t\tstatic func copy_entitlement_by_name_and_index(options: CopyEntitlementByNameAndIndexOptions) -> Dictionary:\n\t\t\treturn IEOS.ecom_interface_copy_entitlement_by_name_and_index(options)\n\n\t\tstatic func copy_item_by_id(options: CopyItemByIdOptions) -> Dictionary:\n\t\t\treturn IEOS.ecom_interface_copy_item_by_id(options)\n\n\t\tstatic func copy_item_image_info_by_index(options: CopyItemImageInfoByIndexOptions) -> Dictionary:\n\t\t\treturn IEOS.ecom_interface_copy_item_image_info_by_index(options)\n\n\t\tstatic func copy_item_release_by_index(options: CopyItemReleaseByIndexOptions) -> Dictionary:\n\t\t\treturn IEOS.ecom_interface_copy_item_release_by_index(options)\n\n\t\tstatic func copy_offer_by_id(options: CopyOfferByIdOptions) -> Dictionary:\n\t\t\treturn IEOS.ecom_interface_copy_offer_by_id(options)\n\n\t\tstatic func copy_offer_by_index(options: CopyOfferByIndexOptions) -> Dictionary:\n\t\t\treturn IEOS.ecom_interface_copy_offer_by_index(options)\n\n\t\tstatic func copy_offer_image_info_by_index(options: CopyOfferImageInfoByIndexOptions) -> Dictionary:\n\t\t\treturn IEOS.ecom_interface_copy_offer_image_info_by_index(options)\n\n\t\tstatic func copy_offer_item_by_index(options: CopyOfferItemByIndexOptions) -> Dictionary:\n\t\t\treturn IEOS.ecom_interface_copy_offer_item_by_index(options)\n\n\t\tstatic func copy_transaction_by_id(options: CopyTransactionByIdOptions) -> Dictionary:\n\t\t\treturn IEOS.ecom_interface_copy_transaction_by_id(options)\n\n\t\tstatic func copy_transaction_by_index(options: CopyTransactionByIndexOptions) -> Dictionary:\n\t\t\treturn IEOS.ecom_interface_copy_transaction_by_index(options)\n\n\t\tstatic func get_entitlements_by_name_count(options: GetEntitlementsByNameCountOptions) -> int:\n\t\t\treturn IEOS.ecom_interface_get_entitlements_by_name_count(options)\n\n\t\tstatic func get_entitlements_count(options: GetEntitlementsCountOptions) -> int:\n\t\t\treturn IEOS.ecom_interface_get_entitlements_count(options)\n\n\t\tstatic func get_item_image_info_count(options: GetItemImageInfoCountOptions) -> int:\n\t\t\treturn IEOS.ecom_interface_get_item_image_info_count(options)\n\n\t\tstatic func get_item_release_count(options: GetItemReleaseCountOptions) -> int:\n\t\t\treturn IEOS.ecom_interface_get_item_release_count(options)\n\n\t\tstatic func get_offer_count(options: GetOfferCountOptions) -> int:\n\t\t\treturn IEOS.ecom_interface_get_offer_count(options)\n\n\t\tstatic func get_offer_image_info_count(options: GetOfferImageInfoCountOptions) -> int:\n\t\t\treturn IEOS.ecom_interface_get_offer_image_info_count(options)\n\n\t\tstatic func get_offer_item_count(options: GetOfferItemCountOptions) -> int:\n\t\t\treturn IEOS.ecom_interface_get_offer_item_count(options)\n\n\t\tstatic func get_transaction_count(options: GetTransactionCountOptions) -> int:\n\t\t\treturn IEOS.ecom_interface_get_transaction_count(options)\n\n\t\tstatic func query_entitlements(options: QueryEntitlementsOptions) -> void:\n\t\t\tIEOS.ecom_interface_query_entitlements(options)\n\n\t\tstatic func query_offers(options: QueryOffersOptions) -> void:\n\t\t\tIEOS.ecom_interface_query_offers(options)\n\n\t\tstatic func query_ownership(options: QueryOwnershipOptions) -> void:\n\t\t\tIEOS.ecom_interface_query_ownership(options)\n\n\t\tstatic func query_ownership_token(options: QueryOwnershipTokenOptions) -> void:\n\t\t\tIEOS.ecom_interface_query_ownership_token(options)\n\n\t\tstatic func redeem_entitlements(options: RedeemEntitlementsOptions) -> void:\n\t\t\tIEOS.ecom_interface_redeem_entitlements(options)\n\n\t\tstatic func get_last_redeemed_entitlements_count(options: GetLastRedeemedEntitlementsCountOptions) -> int:\n\t\t\treturn IEOS.ecom_interface_get_last_redeemed_entitlements_count(options)\n\n\t\tstatic func copy_last_redeemed_entitlement_by_index(options: CopyLastRedeemedEntitlementByIndexOptions) -> Dictionary:\n\t\t\treturn IEOS.ecom_interface_copy_last_redeemed_entitlement_by_index(options)\n\n\n\nclass Friends:\n\tenum FriendsStatus {NotFriends = 0, InviteSent = 1, InviteReceived = 2, Friends = 3}\n\n\tclass AcceptInviteOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"AcceptInviteOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_epic_account_id\n\t\tvar target_user_id = EOSGRuntime.local_epic_account_id\n\n\t\tvar client_data = null\n\n\tclass GetFriendAtIndexOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"GetFriendAtIndexOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_epic_account_id\n\t\tvar index: int\n\n\tclass GetFriendsCountOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"GetFriendsCountOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_epic_account_id\n\n\tclass GetStatusOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"GetStatusOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_epic_account_id\n\t\tvar target_user_id = EOSGRuntime.local_epic_account_id\n\n\tclass QueryFriendsOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"QueryFriendsOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_epic_account_id\n\n\t\tvar client_data = null\n\n\tclass RejectInviteOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"RejectInviteOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_epic_account_id\n\t\tvar target_user_id = EOSGRuntime.local_epic_account_id\n\n\t\tvar client_data = null\n\n\tclass SendInviteOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"SendInviteOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_epic_account_id\n\t\tvar target_user_id = EOSGRuntime.local_epic_account_id\n\n\t\tvar client_data = null\n\n\tclass FriendsInterface:\n\t\tstatic func accept_invite(options: AcceptInviteOptions) -> void:\n\t\t\tIEOS.friends_interface_accept_invite(options)\n\n\t\tstatic func get_friend_at_index(options: GetFriendAtIndexOptions) -> String:\n\t\t\treturn IEOS.friends_interface_get_friend_at_index(options)\n\n\t\tstatic func get_friends_count(options: GetFriendsCountOptions) -> int:\n\t\t\treturn IEOS.friends_interface_get_friends_count(options)\n\n\t\tstatic func get_status(options: GetStatusOptions) -> EOS.Friends.FriendsStatus:\n\t\t\treturn IEOS.friends_interface_get_status(options)\n\n\t\tstatic func query_friends(options: QueryFriendsOptions) -> void:\n\t\t\tIEOS.friends_interface_query_friends(options)\n\n\t\tstatic func reject_invite(options: RejectInviteOptions) -> void:\n\t\t\tIEOS.friends_interface_reject_invite(options)\n\n\t\tstatic func send_invite(options: SendInviteOptions) -> void:\n\t\t\tIEOS.friends_interface_send_invite(options)\n\n\n\nclass KWS:\n\tenum KWSPermissionStatus {Granted = 0, Rejected = 1, Pending = 2}\n\n\tclass CopyPermissionByIndexOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"CopyPermissionByIndexOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar index: int\n\n\tclass CreateUserOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"CreateUserOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\t## Date of birth in ISO8601 form (YYYY-MM-DD)\n\t\tvar date_of_birth: String\n\t\tvar parent_email: String\n\n\tclass GetPermissionByKeyOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"GetPermissionByKeyOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar key: String\n\n\tclass GetPermissionsCountOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"GetPermissionsCountOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\n\tclass QueryAgeGateOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"QueryAgeGateOptions\")\n\n\tclass QueryPermissionsOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"QueryPermissionsOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\n\tclass RequestPermissionsOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"RequestPermissionsOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar permission_keys: Array # Array[String]\n\n\tclass UpdateParentEmailOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"UpdateParentEmailOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar parent_email: String\n\n\tclass KWSInterface:\n\t\tstatic func copy_permission_by_index(options: CopyPermissionByIndexOptions) -> Dictionary:\n\t\t\treturn IEOS.kws_interface_copy_permission_by_index(options)\n\n\t\tstatic func create_user(options: CreateUserOptions) -> void:\n\t\t\tIEOS.kws_interface_create_user(options)\n\n\t\tstatic func get_permission_by_key(options: GetPermissionByKeyOptions) -> Dictionary:\n\t\t\treturn IEOS.kws_interface_get_permission_by_key(options)\n\n\t\tstatic func get_permissions_count(options: GetPermissionsCountOptions) -> int:\n\t\t\treturn IEOS.kws_interface_get_permissions_count(options)\n\n\t\tstatic func query_age_gate(options: QueryAgeGateOptions) -> void:\n\t\t\tIEOS.kws_interface_query_age_gate(options)\n\n\t\tstatic func query_permissions(options: QueryPermissionsOptions) -> void:\n\t\t\tIEOS.kws_interface_query_permissions(options)\n\n\t\tstatic func request_permissions(options: RequestPermissionsOptions) -> void:\n\t\t\tIEOS.kws_interface_request_permissions(options)\n\n\t\tstatic func update_parent_email(options: UpdateParentEmailOptions) -> void:\n\t\t\tIEOS.kws_interface_update_parent_email(options)\n\n\n\nclass Leaderboards:\n\tconst LEADERBOARD_TIME_UNDEFINED = -1\n\n\tenum LeaderboardAggregation {Min = 0, Max = 1, Sum = 2, Latest = 3}\n\n\tclass CopyLeaderboardDefinitionByIndexOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"CopyLeaderboardDefinitionByIndexOptions\")\n\n\t\tvar leaderboard_index: int\n\n\tclass CopyLeaderboardDefinitionByLeaderboardId extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"CopyLeaderboardDefinitionByLeaderboardId\")\n\n\t\tvar leaderboard_id: String\n\n\tclass CopyLeaderboardRecordByIndexOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"CopyLeaderboardRecordByIndexOptions\")\n\n\t\tvar leaderboard_record_index: int\n\n\tclass CopyLeaderboardRecordByUserIdOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"CopyLeaderboardRecordByUserIdOptions\")\n\n\t\tvar user_id: int\n\n\tclass CopyLeaderboardUserScoreByIndexOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"CopyLeaderboardUserScoreByIndexOptions\")\n\n\t\tvar leaderboard_user_score_index: int\n\t\tvar stat_name: String\n\n\tclass CopyLeaderboardUserScoreByUserIdOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"CopyLeaderboardUserScoreByUserIdOptions\")\n\n\t\tvar user_id: String\n\t\tvar stat_name: String\n\n\tclass GetLeaderboardDefinitionCountOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"GetLeaderboardDefinitionCountOptions\")\n\n\tclass GetLeaderboardRecordCountOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"GetLeaderboardRecordCountOptions\")\n\n\tclass GetLeaderboardUserScoreCountOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"GetLeaderboardUserScoreCountOptions\")\n\n\t\tvar stat_name: String\n\n\tclass QueryLeaderboardDefinitionsOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"QueryLeaderboardDefinitionsOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar start_time = LEADERBOARD_TIME_UNDEFINED\n\t\tvar end_time = LEADERBOARD_TIME_UNDEFINED\n\n\t\tvar client_data = null\n\n\tclass QueryLeaderboardRanksOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"QueryLeaderboardRanksOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar leaderboard_id: String\n\n\t\tvar client_data = null\n\n\tclass QueryLeaderboardUserScoresOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"QueryLeaderboardUserScoresOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar user_ids: Array # Array[String]\n\t\tvar stat_info: Array[Dictionary] # [{stat_name: String, aggregation: LeaderboardAggregation}]\n\t\tvar start_time = null # String\n\t\tvar end_time = null # String\n\n\t\tvar client_data = null\n\n\tclass LeaderboardsInterface:\n\t\tstatic func copy_leaderboard_definition_by_index(options: CopyLeaderboardDefinitionByIndexOptions) -> Dictionary:\n\t\t\treturn IEOS.leaderboards_interface_copy_leaderboard_definition_by_index(options)\n\n\t\tstatic func copy_leaderboard_definition_by_leaderboard_id(options: CopyLeaderboardDefinitionByLeaderboardId) -> Dictionary:\n\t\t\treturn IEOS.leaderboards_interface_copy_leaderboard_definition_by_leaderboard_id(options)\n\n\t\tstatic func copy_leaderboard_record_by_index(options: CopyLeaderboardRecordByIndexOptions) -> Dictionary:\n\t\t\treturn IEOS.leaderboards_interface_copy_leaderboard_record_by_index(options)\n\n\t\tstatic func copy_leaderboard_record_by_user_id(options: CopyLeaderboardRecordByUserIdOptions) -> Dictionary:\n\t\t\treturn IEOS.leaderboards_interface_copy_leaderboard_record_by_user_id(options)\n\n\t\tstatic func copy_leaderboard_user_score_by_index(options: CopyLeaderboardUserScoreByIndexOptions) -> Dictionary:\n\t\t\treturn IEOS.leaderboards_interface_copy_leaderboard_user_score_by_index(options)\n\n\t\tstatic func copy_leaderboard_user_score_by_user_id(options: CopyLeaderboardUserScoreByUserIdOptions) -> Dictionary:\n\t\t\treturn IEOS.leaderboards_interface_copy_leaderboard_user_score_by_user_id(options)\n\n\t\tstatic func get_leaderboard_definition_count(options: GetLeaderboardDefinitionCountOptions) -> int:\n\t\t\treturn IEOS.leaderboards_interface_get_leaderboard_definition_count(options)\n\n\t\tstatic func get_leaderboard_record_count(options: GetLeaderboardRecordCountOptions) -> int:\n\t\t\treturn IEOS.leaderboards_interface_get_leaderboard_record_count(options)\n\n\t\tstatic func get_leaderboard_user_score_count(options: GetLeaderboardUserScoreCountOptions) -> int:\n\t\t\treturn IEOS.leaderboards_interface_get_leaderboard_user_score_count(options)\n\n\t\tstatic func query_leaderboard_definitions(options: QueryLeaderboardDefinitionsOptions) -> void:\n\t\t\tIEOS.leaderboards_interface_query_leaderboard_definitions(options)\n\n\t\tstatic func query_leaderboard_ranks(options: QueryLeaderboardRanksOptions) -> void:\n\t\t\tIEOS.leaderboards_interface_query_leaderboard_ranks(options)\n\n\t\tstatic func query_leaderboard_user_scores(options: QueryLeaderboardUserScoresOptions) -> void:\n\t\t\tIEOS.leaderboards_interface_query_leaderboard_user_scores(options)\n\n\n\nclass Lobby:\n\tenum LobbyAttributeVisibility { Public = 0, Private = 1}\n\n\tenum LobbyMemberStatus {\n\t\tJoined = 0,\n\t\tLeft = 1,\n\t\tDisconnected = 2,\n\t\tKicked = 3,\n\t\tPromoted = 4,\n\t\tClosed = 5\n\t}\n\n\tenum LobbyPermissionLevel { PublicAdvertised = 0, JoinViaPresence = 1, InviteOnly = 2}\n\n\tenum LobbyRTCRoomJoinActionType {\n\t\t## Join RTC Room as soon as user joins the lobby\n\t\tAutomaticJoin = 0,\n\t\t## Do not join RTC Room when joining the lobby. User must manually call Join RTC Room\n\t\tManualJoin = 1\n\t}\n\n\tconst SEARCH_BUCKET_ID = \"bucket\"\n\tconst SEARCH_MINCURRENT_MEMBERS = \"mincurrentmembers\"\n\tconst SEARCH_MINSLOTSAVAILABLE = \"minslotsavailable\"\n\n\tclass CreateLobbyOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"CreateLobbyOptions\")\n\n\t\tvar bucket_id: String\n\t\tvar lobby_id: String\n\t\tvar disable_host_migration: bool\n\t\tvar max_lobby_members: int\n\t\tvar rejoin_after_kick_requires_invite: bool\n\t\tvar crossplay_opt_out: bool\n\t\tvar enable_rtc_room: bool\n\n\t\tvar allow_invites := true\n\t\tvar enable_join_by_id := true\n\t\tvar local_user_id := EOSGRuntime.local_product_user_id\n\t\tvar permission_level: LobbyPermissionLevel = LobbyPermissionLevel.PublicAdvertised\n\t\tvar presence_enabled := true\n\n\t\t## (Optional) Allows the local application to set local audio options for the RTC Room if it is enabled. Set this to a [Dictionary] to override the defaults.[br]\n\t\t## A [Dictionary] with keys: [br]\n\t\t## - flags: A bitwise-or union of [enum EOS.RTC.JoinRoomFlags],[br]\n\t\t## - use_manual_audio_input: [bool],[br]\n\t\t## - use_manual_audio_output: [bool],[br]\n\t\t## - local_audio_device_input_starts_muted: [bool]\n\t\tvar local_rtc_options = null\n\t\tvar rtc_room_join_action_type = LobbyRTCRoomJoinActionType.AutomaticJoin\n\n\t\tvar client_data = null\n\n\tclass DestroyLobbyOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"DestroyLobbyOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar lobby_id: String\n\n\t\tvar client_data = null\n\n\tclass JoinLobbyOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"JoinLobbyOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar lobby_details: EOSGLobbyDetails\n\t\tvar presence_enabled: bool\n\t\t## (Optional) Allows the local application to set local audio options for the RTC Room if it is enabled. Set this to a [Dictionary] to override the defaults.[br]\n\t\t## A [Dictionary] with keys: [br]\n\t\t## - flags: A bitwise-or union of [enum EOS.RTC.JoinRoomFlags],[br]\n\t\t## - use_manual_audio_input: [bool],[br]\n\t\t## - use_manual_audio_output: [bool],[br]\n\t\t## - local_audio_device_input_starts_muted: [bool]\n\t\tvar local_rtc_options = null\n\t\tvar rtc_room_join_action_type = LobbyRTCRoomJoinActionType.AutomaticJoin\n\n\t\tvar client_data = null\n\n\tclass JoinLobbyByIdOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"JoinLobbyByIdOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar lobby_id: String\n\t\tvar presence_enabled: bool\n\t\t## (Optional) Allows the local application to set local audio options for the RTC Room if it is enabled. Set this to a [Dictionary] to override the defaults.[br]\n\t\t## A [Dictionary] with keys: [br]\n\t\t## - flags: A bitwise-or union of [enum EOS.RTC.JoinRoomFlags],[br]\n\t\t## - use_manual_audio_input: [bool],[br]\n\t\t## - use_manual_audio_output: [bool],[br]\n\t\t## - local_audio_device_input_starts_muted: [bool]\n\t\tvar local_rtc_options = null\n\t\tvar rtc_room_join_action_type = LobbyRTCRoomJoinActionType.AutomaticJoin\n\n\t\tvar client_data = null\n\n\tclass LeaveLobbyOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"LeaveLobbyOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar lobby_id: String\n\n\t\tvar client_data = null\n\n\tclass UpdateLobbyModificationOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"UpdateLobbyModificationOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar lobby_id: String\n\n\t\tvar client_data = null\n\n\tclass UpdateLobbyOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"UpdateLobbyOptions\")\n\n\t\tvar lobby_modification: EOSGLobbyModification\n\n\t\tvar client_data = null\n\n\tclass PromoteMemberOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"PromoteMemberOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar target_user_id: String\n\t\tvar lobby_id: String\n\n\t\tvar client_data = null\n\n\tclass KickMemberOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"KickMemberOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar target_user_id: String\n\t\tvar lobby_id: String\n\n\t\tvar client_data = null\n\n\tclass HardMuteMemberOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"HardMuteMemberOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar target_user_id: String\n\t\tvar lobby_id: String\n\t\tvar hard_mute: bool\n\n\t\tvar client_data = null\n\n\tclass SendInviteOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"SendInviteOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar target_user_id: String\n\t\tvar lobby_id: String\n\n\t\tvar client_data = null\n\n\tclass RejectInviteOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"RejectInviteOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar invite_id: String\n\n\t\tvar client_data = null\n\n\tclass QueryInvitesOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"QueryInvitesOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\n\t\tvar client_data = null\n\n\tclass GetInviteCountOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"GetInviteCountOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\n\tclass GetInviteIdByIndexOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"GetInviteIdByIndexOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar index: int\n\n\tclass CreateLobbySearchOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"CreateLobbySearchOptions\")\n\n\t\tvar max_results := 10\n\n\tclass CopyLobbyDetailsByInviteIdOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"CopyLobbyDetailsByInviteIdOptions\")\n\n\t\tvar invite_id: String\n\n\tclass CopyLobbyDetailsByUiEventIdOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"CopyLobbyDetailsByUiEventIdOptions\")\n\n\t\tvar ui_event_id: String\n\n\tclass CopyLobbyDetailsOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"CopyLobbyDetailsOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar lobby_id: String\n\n\tclass GetRtcRoomNameOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"GetRtcRoomNameOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar lobby_id: String\n\n\tclass IsRtcRoomConnectedOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"IsRtcRoomConnectedOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar lobby_id: String\n\n\tclass JoinRTCRoomOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"JoinRTCRoomOptions\")\n\t\t\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar lobby_id: String\n\t\t\n\t\t## (Optional) Allows the local application to set local audio options for the RTC Room if it is enabled. Set this to a [Dictionary] to override the defaults.[br]\n\t\t## A [Dictionary] with keys: [br]\n\t\t## - flags: A bitwise-or union of [enum EOS.RTC.JoinRoomFlags],[br]\n\t\t## - use_manual_audio_input: [bool],[br]\n\t\t## - use_manual_audio_output: [bool],[br]\n\t\t## - local_audio_device_input_starts_muted: [bool]\n\t\tvar local_rtc_options = null\n\t\n\tclass LeaveRTCRoomOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"LeaveRTCRoomOptions\")\n\t\t\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar lobby_id: String\n\t\t\n\tclass LobbyInterface:\n\t\tstatic func create_lobby(options: CreateLobbyOptions) -> void:\n\t\t\tIEOS.lobby_interface_create_lobby(options)\n\n\t\tstatic func destroy_lobby(options: DestroyLobbyOptions) -> void:\n\t\t\tIEOS.lobby_interface_destroy_lobby(options)\n\n\t\tstatic func join_lobby(options: JoinLobbyOptions) -> void:\n\t\t\tIEOS.lobby_interface_join_lobby(options)\n\n\t\tstatic func join_lobby_by_id(options: JoinLobbyByIdOptions) -> void:\n\t\t\tIEOS.lobby_interface_join_lobby_by_id(options)\n\n\t\tstatic func leave_lobby(options: LeaveLobbyOptions) -> void:\n\t\t\tIEOS.lobby_interface_leave_lobby(options)\n\n\t\tstatic func update_lobby_modification(options: UpdateLobbyModificationOptions) -> Dictionary:\n\t\t\treturn IEOS.lobby_interface_update_lobby_modification(options)\n\n\t\tstatic func update_lobby(options: UpdateLobbyOptions) -> void:\n\t\t\tIEOS.lobby_interface_update_lobby(options)\n\n\t\tstatic func promote_member(options: PromoteMemberOptions) -> void:\n\t\t\tIEOS.lobby_interface_promote_member(options)\n\n\t\tstatic func kick_member(options: KickMemberOptions) -> void:\n\t\t\tIEOS.lobby_interface_kick_member(options)\n\n\t\tstatic func hard_mute_member(options: HardMuteMemberOptions) -> void:\n\t\t\tIEOS.lobby_interface_hard_mute_member(options)\n\n\t\tstatic func send_invite(options: SendInviteOptions) -> void:\n\t\t\tIEOS.lobby_interface_send_invite(options)\n\n\t\tstatic func reject_invite(options: RejectInviteOptions) -> void:\n\t\t\tIEOS.lobby_interface_reject_invite(options)\n\n\t\tstatic func query_invites(options: QueryInvitesOptions) -> void:\n\t\t\tIEOS.lobby_interface_query_invites(options)\n\n\t\tstatic func get_invite_count(options: GetInviteCountOptions) -> int:\n\t\t\treturn IEOS.lobby_interface_get_invite_count(options)\n\n\t\tstatic func get_invite_id_by_index(options: GetInviteIdByIndexOptions) -> Dictionary:\n\t\t\treturn IEOS.lobby_interface_get_invite_id_by_index(options)\n\n\t\tstatic func create_lobby_search(options: CreateLobbySearchOptions) -> Dictionary:\n\t\t\treturn IEOS.lobby_interface_create_lobby_search(options)\n\n\t\tstatic func copy_lobby_details_by_invite_id(options: CopyLobbyDetailsByInviteIdOptions) -> Dictionary:\n\t\t\treturn IEOS.lobby_interface_copy_lobby_details_by_invite_id(options)\n\n\t\tstatic func copy_lobby_details_by_ui_event_id(options: CopyLobbyDetailsByUiEventIdOptions) -> Dictionary:\n\t\t\treturn IEOS.lobby_interface_copy_lobby_details_by_ui_event_id(options)\n\n\t\tstatic func copy_lobby_details(options: CopyLobbyDetailsOptions) -> Dictionary:\n\t\t\treturn IEOS.lobby_interface_copy_lobby_details(options)\n\n\t\tstatic func get_rtc_room_name(options: GetRtcRoomNameOptions) -> Dictionary:\n\t\t\treturn IEOS.lobby_interface_get_rtc_room_name(options)\n\n\t\tstatic func is_rtc_room_connected(options: IsRtcRoomConnectedOptions) -> Dictionary:\n\t\t\treturn IEOS.lobby_interface_is_rtc_room_connected(options)\n\n\n\nclass Metrics:\n\tenum MetricsAccountIdType {Epic = 0, External = 1}\n\n\tenum UserControllerType {Unknown = 0, MouseKeyboard = 1, GamepadControl = 2, TouchControl = 3}\n\n\tclass BeginPlayerSessionOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"BeginPlayerSessionOptions\")\n\n\t\tvar account_id_type: MetricsAccountIdType\n\t\tvar account_id: String\n\t\tvar controller_type: UserControllerType\n\t\tvar display_name: String\n\t\tvar game_session_id = null # String\n\t\tvar server_ip = null # String\n\n\tclass EndPlayerSessionOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"EndPlayerSessionOptions\")\n\n\t\tvar account_id_type: MetricsAccountIdType\n\t\tvar account_id: String\n\n\tclass MetricsInterface:\n\t\tstatic func begin_player_session(options: BeginPlayerSessionOptions) -> Result:\n\t\t\treturn IEOS.metrics_interface_begin_player_session(options)\n\n\t\tstatic func end_player_session(options: EndPlayerSessionOptions) -> Result:\n\t\t\treturn IEOS.metrics_interface_end_player_session(options)\n\n\n\nclass Mods:\n\tenum ModEnumerationType {Installed = 0, AllAvailable}\n\n\tclass CopyModInfoOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"CopyModInfoOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_epic_account_id\n\t\tvar type: ModEnumerationType\n\n\tclass EnumerateModsOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"EnumerateModsOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_epic_account_id\n\t\tvar type: ModEnumerationType\n\n\tclass InstallModOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"InstallModOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_epic_account_id\n\t\tvar mod: Dictionary\n\n\tclass UninstallModOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"UninstallModOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_epic_account_id\n\t\tvar mod: Dictionary\n\n\tclass UpdateModOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"UpdateModOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_epic_account_id\n\t\tvar mod: Dictionary\n\n\tclass ModsInterface:\n\t\tstatic func copy_mod_info(options: CopyModInfoOptions) -> Dictionary:\n\t\t\treturn IEOS.mods_interface_copy_mod_info(options)\n\n\t\tstatic func enumerate_mods(options: EnumerateModsOptions) -> void:\n\t\t\tIEOS.mods_interface_enumerate_mods(options)\n\n\t\tstatic func install_mod(options: InstallModOptions) -> void:\n\t\t\tIEOS.mods_interface_install_mod(options)\n\n\t\tstatic func uninstall_mod(options: UninstallModOptions) -> void:\n\t\t\tIEOS.mods_interface_uninstall_mod(options)\n\n\t\tstatic func update_mod(options: UpdateModOptions) -> void:\n\t\t\tIEOS.mods_interface_update_mod(options)\n\n\n\nclass P2P:\n\tenum ConnectionClosedReason {\n\t\tUnknown = 0,\n\t\tClosedByLocalUser = 1,\n\t\tClosedByPeer = 2,\n\t\tTimedOut = 3,\n\t\tTooManyConnections = 4,\n\t\tInvalidMessage = 5,\n\t\tInvalidData = 6,\n\t\tConnectionFailed = 7,\n\t\tConnectionClosed = 8,\n\t\tNegotiationFailed = 9,\n\t\tUnexpectedError = 10\n\t}\n\n\tenum ConnectionEstablishedType {NewConnection = 0, Reconnection = 1}\n\n\tenum NATType {Unknown = 0, Open = 1, Moderate = 2, Strict = 3}\n\n\tenum PacketReliability {UnreliableUnordered = 0, ReliableUnordered = 1, ReliableOrdered = 2}\n\n\tenum RelayControl {NoRelays = 0, AllowRelays = 1, ForceRelays = 2}\n\n\tenum NetworkType {NoConnection = 0, DirectConnection = 1, RelayedConnection = 2}\n\n\tenum Mode {None = 0, Server = 1, Client = 2, Mesh = 3}\n\n\tenum ConnectionStatus {Disconnected = 0, Connecting = 1, Connected = 2}\n\n\tclass SetPortRangeOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"SetPortRangeOptions\")\n\n\t\tvar port: int\n\t\tvar max_additional_ports_to_try: int\n\n\tclass SetPacketQueueSizeOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"SetPacketQueueSizeOptions\")\n\n\t\tvar incoming_packet_queue_max_size_bytes: int\n\t\tvar outgoing_packet_queue_max_size_bytes: int\n\n\tclass P2PInterface:\n\t\tstatic func get_packet_queue_info() -> Dictionary:\n\t\t\treturn IEOS.p2p_interface_get_packet_queue_info()\n\n\t\tstatic func get_port_range() -> Dictionary:\n\t\t\treturn IEOS.p2p_interface_get_port_range()\n\n\t\tstatic func get_nat_type() -> Dictionary:\n\t\t\treturn IEOS.p2p_interface_get_nat_type()\n\n\t\tstatic func get_relay_control() -> Dictionary:\n\t\t\treturn IEOS.p2p_interface_get_relay_control()\n\n\t\tstatic func query_nat_type() -> void:\n\t\t\tIEOS.p2p_interface_query_nat_type()\n\n\t\tstatic func set_packet_queue_size(options: SetPacketQueueSizeOptions) -> EOS.Result:\n\t\t\treturn IEOS.p2p_interface_set_packet_queue_size(options)\n\n\t\tstatic func set_port_range(options: SetPortRangeOptions) -> EOS.Result:\n\t\t\treturn IEOS.p2p_interface_set_port_range(options)\n\n\t\tstatic func set_relay_control(relay_control: RelayControl) -> EOS.Result:\n\t\t\treturn IEOS.p2p_interface_set_relay_control(relay_control)\n\n\n\nclass Presence:\n\tenum Status {Offline = 0, Online = 1, Away = 2, ExtendedAway = 3, DoNotDisturb = 4}\n\n\tclass CopyPresenceOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"CopyPresenceOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_epic_account_id\n\t\tvar target_user_id = EOSGRuntime.local_epic_account_id\n\n\tclass CreatePresenceModificationOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"CopyPresenceOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_epic_account_id\n\n\tclass PresenceModificationSetDataOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"PresenceModificationSetDataOptions\")\n\n\t\tvar records: Array[Dictionary] # {key: String, value: String}\n\n\tclass PresenceModificationDeleteDataOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"PresenceModificationDeleteDataOptions\")\n\n\t\tvar records: Array # Array[String]\n\n\tclass PresenceModificationSetJoinInfoOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"PresenceModificationSetJoinInfoOptions\")\n\n\t\tvar join_info: String\n\n\tclass PresenceModificationSetRawRichTextOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"PresenceModificationSetRawRichTextOptions\")\n\n\t\tvar rich_text: String\n\n\tclass PresenceModificationSetStatusOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"PresenceModificationSetStatusOptions\")\n\n\t\tvar status: int\n\n\tclass GetJoinInfoOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"GetJoinInfoOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_epic_account_id\n\t\tvar target_user_id = EOSGRuntime.local_epic_account_id\n\n\tclass HasPresenceOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"HasPresenceOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_epic_account_id\n\t\tvar target_user_id = EOSGRuntime.local_epic_account_id\n\n\tclass QueryPresenceOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"QueryPresenceOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_epic_account_id\n\t\tvar target_user_id = EOSGRuntime.local_epic_account_id\n\n\t\tvar client_data = null\n\n\tclass SetPresenceOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"SetPresenceOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_epic_account_id\n\t\tvar presence_modification: RefCounted # PresenceModificationWrapper\n\n\t\tvar client_data = null\n\n\tclass PresenceInterface:\n\t\tstatic func copy_presence(options: CopyPresenceOptions) -> Dictionary:\n\t\t\treturn IEOS.presence_interface_copy_presence(options)\n\n\t\tstatic func create_presence_modification(options: CreatePresenceModificationOptions) -> Dictionary:\n\t\t\treturn IEOS.presence_interface_create_presence_modification(options)\n\n\t\tstatic func get_join_info(options: GetJoinInfoOptions) -> Dictionary:\n\t\t\treturn IEOS.presence_interface_get_join_info(options)\n\n\t\tstatic func has_presence(options: HasPresenceOptions) -> bool:\n\t\t\treturn IEOS.presence_interface_has_presence(options)\n\n\t\tstatic func query_presence(options: QueryPresenceOptions) -> void:\n\t\t\tIEOS.presence_interface_query_presence(options)\n\n\t\tstatic func set_presence(options: SetPresenceOptions) -> void:\n\t\t\tIEOS.presence_interface_set_presence(options)\n\n\n\nclass Reports:\n\tenum PlayerReportsCategory {\n\t\tInvalid = 0,\n\t\tCheating = 1,\n\t\tExploiting = 2,\n\t\tOffensiveProfile = 3,\n\t\tVerbalAbuse = 4,\n\t\tScamming = 5,\n\t\tSpamming = 6,\n\t\tOther = 7\n\t}\n\n\tclass SendPlayerBehaviorReportOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"SendPlayerBehaviorReportOptions\")\n\n\t\tvar category: PlayerReportsCategory\n\t\tvar context: String\n\t\tvar message: String\n\t\tvar reported_user_id: String\n\t\tvar reporter_user_id = EOSGRuntime.local_product_user_id\n\n\t\tvar client_data = null\n\n\tclass ReportsInterface:\n\t\tstatic func send_player_behavior_report(options: SendPlayerBehaviorReportOptions) -> void:\n\t\t\tIEOS.reports_interface_send_player_behavior_report(options)\n\n\n\nclass ProgressionSnapshot:\n\tclass BeginSnapshotOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"BeginSnapshotOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\n\tclass AddProgressionOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"AddProgressionOptions\")\n\n\t\tvar key: String\n\t\tvar snapshot_id: int\n\t\tvar value: String\n\n\tclass SubmitSnapshotOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"SubmitSnapshotOptions\")\n\n\t\tvar snapshot_id: int\n\n\t\tvar client_data = null\n\n\tclass DeleteSnapshotOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"DeleteSnapshotOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\n\t\tvar client_data = null\n\n\tclass EndSnapshotOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"EndSnapshotOptions\")\n\n\t\tvar snapshot_id: int\n\n\tclass ProgressionSnapshotInterface:\n\t\tstatic func begin_snapshot(options: BeginSnapshotOptions) -> Dictionary:\n\t\t\treturn IEOS.progression_snapshot_interface_begin_snapshot(options)\n\n\t\tstatic func add_progression(options: AddProgressionOptions) -> Result:\n\t\t\treturn IEOS.progression_snapshot_interface_add_progression(options)\n\n\t\tstatic func submit_snapshot(options: SubmitSnapshotOptions) -> void:\n\t\t\tIEOS.progression_snapshot_interface_submit_snapshot(options)\n\n\t\tstatic func delete_snapshot(options: DeleteSnapshotOptions) -> void:\n\t\t\tIEOS.progression_snapshot_interface_delete_snapshot(options)\n\n\t\tstatic func end_snapshot(options: EndSnapshotOptions) -> void:\n\t\t\tIEOS.progression_snapshot_interface_end_snapshot(options)\n\n\n\nclass UI:\n\tconst ModifierShift = 16\n\tconst KeyTypeMask = (1 << ModifierShift) - 1\n\tconst ModifierMask = ~KeyTypeMask\n\tconst Shift = 1 << ModifierShift\n\tconst Control_ = 2 << ModifierShift\n\tconst Alt = 4 << ModifierShift\n\tconst Meta = 8 << ModifierShift\n\tconst ValidModifierMask = Shift | Control_ | Alt | Meta\n\n\tenum NotificationLocation {TopLeft, TopRight, BottomLeft, BottomRight}\n\n\tenum KeyCombination {\n\t\tModifierShift = 16,\n\t\tKeyTypeMask = (1 << ModifierShift) - 1,\n\t\tModifierMask = ~KeyTypeMask,\n\t\tShift = 1 << ModifierShift,\n\t\tControl_ = 2 << ModifierShift,\n\t\tAlt = 4 << ModifierShift,\n\t\tMeta = 8 << ModifierShift,\n\t\tValidModifierMask = Shift | Control_ | Alt | Meta,\n\t\tNone = 0,\n\t\tSpace,\n\t\tBackspace,\n\t\tTab,\n\t\tEscape,\n\t\tPageUp,\n\t\tPageDown,\n\t\tEnd,\n\t\tHome,\n\t\tInsert,\n\t\tDelete,\n\t\tLeft,\n\t\tUp,\n\t\tRight,\n\t\tDown,\n\t\tKey0,\n\t\tKey1,\n\t\tKey2,\n\t\tKey3,\n\t\tKey4,\n\t\tKey5,\n\t\tKey6,\n\t\tKey7,\n\t\tKey8,\n\t\tKey9,\n\t\tKeyA,\n\t\tKeyB,\n\t\tKeyC,\n\t\tKeyD,\n\t\tKeyE,\n\t\tKeyF,\n\t\tKeyG,\n\t\tKeyH,\n\t\tKeyI,\n\t\tKeyJ,\n\t\tKeyK,\n\t\tKeyL,\n\t\tKeyM,\n\t\tKeyN,\n\t\tKeyO,\n\t\tKeyP,\n\t\tKeyQ,\n\t\tKeyR,\n\t\tKeyS,\n\t\tKeyT,\n\t\tKeyU,\n\t\tKeyV,\n\t\tKeyW,\n\t\tKeyX,\n\t\tKeyY,\n\t\tKeyZ,\n\t\tNumpad0,\n\t\tNumpad1,\n\t\tNumpad2,\n\t\tNumpad3,\n\t\tNumpad4,\n\t\tNumpad5,\n\t\tNumpad6,\n\t\tNumpad7,\n\t\tNumpad8,\n\t\tNumpad9,\n\t\tNumpadAsterisk,\n\t\tNumpadPlus,\n\t\tNumpadMinus,\n\t\tNumpadPeriod,\n\t\tNumpadDivide,\n\t\tF1,\n\t\tF2,\n\t\tF3,\n\t\tF4,\n\t\tF5,\n\t\tF6,\n\t\tF7,\n\t\tF8,\n\t\tF9,\n\t\tF10,\n\t\tF11,\n\t\tF12,\n\t\tF13,\n\t\tF14,\n\t\tF15,\n\t\tF16,\n\t\tF17,\n\t\tF18,\n\t\tF19,\n\t\tF20,\n\t\tF21,\n\t\tF22,\n\t\tF23,\n\t\tF24,\n\t\tOemPlus,\n\t\tOemComma,\n\t\tOemMinus,\n\t\tOemPeriod,\n\t\tOem1,\n\t\tOem2,\n\t\tOem3,\n\t\tOem4,\n\t\tOem5,\n\t\tOem6,\n\t\tOem7,\n\t\tOem8,\n\t\tMaxKeyType\n\t}\n\n\tenum InputStateButtonFlags {\n\t\tNone = 0,\n\t\tDPadLeft = (1 << 0),\n\t\tDPadRight = (1 << 1),\n\t\tDPadDown = (1 << 2),\n\t\tDPadUp = (1 << 3),\n\t\tFaceButtonLeft = (1 << 4),\n\t\tFaceButtonRight = (1 << 5),\n\t\tFaceButtonBottom = (1 << 6),\n\t\tFaceButtonTop = (1 << 7),\n\t\tLeftShoulder = (1 << 8),\n\t\tRightShoulder = (1 << 9),\n\t\tLeftTrigger = (1 << 10),\n\t\tRightTrigger = (1 << 11),\n\t\tSpecialLeft = (1 << 12),\n\t\tSpecialRight = (1 << 13),\n\t\tLeftThumbstick = (1 << 14),\n\t\tRightThumbstick = (1 << 15),\n\t}\n\n\tclass AcknowledgeEventIdOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"AcknowledgeEventIdOptions\")\n\n\t\tvar ui_event_id: int\n\t\tvar result: int\n\n\tclass GetFriendsVisibleOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"GetFriendsVisibleOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_epic_account_id\n\n\tclass GetToggleFriendsKeyOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"GetToggleFriendsKeyOptions\")\n\n\tclass HideFriendsOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"HideFriendsOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_epic_account_id\n\n\t\tvar client_data = null\n\n\tclass SetDisplayPreferenceOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"SetDisplayPreferenceOptions\")\n\n\t\tvar notification_location: NotificationLocation\n\n\tclass SetToggleFriendsKeyOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"SetToggleFriendsKeyOptions\")\n\n\t\tvar key_combination: KeyCombination\n\n\tclass ShowFriendsOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"ShowFriendsOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_epic_account_id\n\n\t\tvar client_data = null\n\n\tclass GetFriendsExclusiveInputOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"GetFriendsExclusiveInputOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_epic_account_id\n\n\tclass ShowBlockPlayerOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"ShowBlockPlayerOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_epic_account_id\n\t\tvar target_user_id: String\n\n\tclass ShowReportPlayerOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"ShowReportPlayerOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_epic_account_id\n\t\tvar target_user_id: String\n\n\tclass PauseSocialOverlayOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"PauseSocialOverlayOptions\")\n\n\t\tvar is_paused: bool\n\n\tclass IsSocialOverlayPausedOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"IsSocialOverlayPausedOptions\")\n\n\tclass ReportInputStateOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"ReportInputStateOptions\")\n\n\t\tvar button_down_flags: InputStateButtonFlags\n\t\tvar gamepad_index: int\n\t\tvar left_stick_x: float\n\t\tvar left_stick_y: float\n\t\tvar left_trigger: float\n\t\tvar mouse_pos_x: int\n\t\tvar mouse_pos_y: int\n\t\tvar right_stick_x: float\n\t\tvar right_stick_y: float\n\t\tvar right_trigger: float\n\n\tclass PrePresentOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"PrePresentOptions\")\n\n\tclass ShowNativeProfileOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"ShowNativeProfileOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_epic_account_id\n\t\tvar target_user_id: String\n\n\tclass UIInterface:\n\t\tstatic func acknowledge_event_id(options: AcknowledgeEventIdOptions) -> Result:\n\t\t\treturn IEOS.ui_interface_acknowledge_event_id(options)\n\n\t\tstatic func get_friends_visible(options: GetFriendsVisibleOptions) -> bool:\n\t\t\treturn IEOS.ui_interface_get_friends_visible(options)\n\n\t\tstatic func get_notification_location_preference() -> EOS.UI.NotificationLocation:\n\t\t\treturn IEOS.ui_interface_get_notification_location_preference()\n\n\t\tstatic func get_toggle_friends_key(options: GetToggleFriendsKeyOptions) -> EOS.UI.KeyCombination:\n\t\t\treturn IEOS.ui_interface_get_toggle_friends_key(options)\n\n\t\tstatic func hide_friends(options: HideFriendsOptions) -> void:\n\t\t\tIEOS.ui_interface_hide_friends(options)\n\n\t\tstatic func is_valid_key_combination(key_combination: EOS.UI.KeyCombination) -> bool:\n\t\t\treturn IEOS.ui_interface_is_valid_key_combination(key_combination)\n\n\t\tstatic func set_display_preference(options: SetDisplayPreferenceOptions) -> EOS.UI.NotificationLocation:\n\t\t\treturn IEOS.ui_interface_set_display_preference(options)\n\n\t\tstatic func set_toggle_friends_key(options: SetToggleFriendsKeyOptions) -> Result:\n\t\t\treturn IEOS.ui_interface_set_toggle_friends_key(options)\n\n\t\tstatic func show_friends(options: ShowFriendsOptions) -> void:\n\t\t\tIEOS.ui_interface_show_friends(options)\n\n\t\tstatic func get_friends_exclusive_input(options: GetFriendsExclusiveInputOptions) -> bool:\n\t\t\treturn IEOS.ui_interface_get_friends_exclusive_input(options)\n\n\t\tstatic func show_block_player(options: ShowBlockPlayerOptions) -> void:\n\t\t\tIEOS.ui_interface_show_block_player(options)\n\n\t\tstatic func show_report_player(options: ShowReportPlayerOptions) -> void:\n\t\t\tIEOS.ui_interface_show_report_player(options)\n\n\t\tstatic func pause_social_overlay(options: PauseSocialOverlayOptions) -> Result:\n\t\t\treturn IEOS.ui_interface_pause_social_overlay(options)\n\n\t\tstatic func is_social_overlay_paused(options: IsSocialOverlayPausedOptions) -> bool:\n\t\t\treturn IEOS.ui_interface_is_social_overlay_paused(options)\n\n\t\tstatic func set_toggle_friends_button(options: SetToggleFriendsKeyOptions) -> Result:\n\t\t\treturn IEOS.ui_interface_set_toggle_friends_button(options)\n\n\t\tstatic func report_input_state(options: ReportInputStateOptions) -> Result:\n\t\t\treturn IEOS.ui_interface_report_input_state(options)\n\n\t\tstatic func pre_present(options: PrePresentOptions) -> Result:\n\t\t\treturn IEOS.ui_interface_pre_present(options)\n\n\t\tstatic func show_native_profile(options: ShowNativeProfileOptions) -> void:\n\t\t\tIEOS.ui_interface_show_native_profile(options)\n\n\n\nclass UserInfo:\n\tclass CopyExternalUserInfoByAccountIdOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"CopyExternalUserInfoByAccountIdOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_epic_account_id\n\t\tvar target_user_id = EOSGRuntime.local_epic_account_id\n\t\tvar account_id: String\n\n\tclass CopyExternalUserInfoByAccountTypeOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"CopyExternalUserInfoByAccountTypeOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_epic_account_id\n\t\tvar target_user_id = EOSGRuntime.local_epic_account_id\n\t\tvar account_type: ExternalAccountType\n\n\tclass CopyExternalUserInfoByIndexOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"CopyExternalUserInfoByIndexOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_epic_account_id\n\t\tvar target_user_id = EOSGRuntime.local_epic_account_id\n\t\tvar index: int\n\n\tclass CopyUserInfoOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"CopyUserInfoOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_epic_account_id\n\t\tvar target_user_id = EOSGRuntime.local_epic_account_id\n\n\tclass GetExternalUserInfoCountOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"GetExternalUserInfoCountOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_epic_account_id\n\t\tvar target_user_id = EOSGRuntime.local_epic_account_id\n\n\tclass QueryUserInfoOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"QueryUserInfoOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_epic_account_id\n\t\tvar target_user_id = EOSGRuntime.local_epic_account_id\n\n\t\tvar client_data = null\n\n\tclass QueryUserInfoByDisplayNameOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"QueryUserInfoByDisplayNameOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_epic_account_id\n\t\tvar display_name: String\n\n\t\tvar client_data = null\n\n\tclass QueryUserInfoByExternalAccountOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"QueryUserInfoByExternalAccountOptions\")\n\n\t\tvar account_type: ExternalAccountType\n\t\tvar external_account_id: String\n\t\tvar local_user_id = EOSGRuntime.local_epic_account_id\n\n\t\tvar client_data = null\n\n\tclass CopyBestDisplayNameOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"CopyBestDisplayNameOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_epic_account_id\n\t\tvar target_user_id = EOSGRuntime.local_epic_account_id\n\n\tclass CopyBestDisplayNameWithPlatformOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"CopyBestDisplayNameWithPlatformOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_epic_account_id\n\t\tvar target_user_id = EOSGRuntime.local_epic_account_id\n\t\tvar target_platform_type: OnlinePlatformType\n\n\tclass GetLocalPlatformTypeOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"GetLocalPlatformTypeOptions\")\n\n\tclass UserInfoInterface:\n\t\tstatic func copy_external_user_info_by_account_id(options: CopyExternalUserInfoByAccountIdOptions) -> Dictionary:\n\t\t\treturn IEOS.user_info_interface_copy_external_user_info_by_account_id(options)\n\n\t\tstatic func copy_external_user_info_by_account_type(options: CopyExternalUserInfoByAccountTypeOptions) -> Dictionary:\n\t\t\treturn IEOS.user_info_interface_copy_external_user_info_by_account_type(options)\n\n\t\tstatic func copy_external_user_info_by_index(options: CopyExternalUserInfoByIndexOptions) -> Dictionary:\n\t\t\treturn IEOS.user_info_interface_copy_external_user_info_by_index(options)\n\n\t\tstatic func copy_user_info(options: CopyUserInfoOptions) -> Dictionary:\n\t\t\treturn IEOS.user_info_interface_copy_user_info(options)\n\n\t\tstatic func get_external_user_info_count(options: GetExternalUserInfoCountOptions) -> int:\n\t\t\treturn IEOS.user_info_interface_get_external_user_info_count(options)\n\n\t\tstatic func query_user_info(options: QueryUserInfoOptions) -> void:\n\t\t\tIEOS.user_info_interface_query_user_info(options)\n\n\t\tstatic func query_user_info_by_display_name(options: QueryUserInfoByDisplayNameOptions) -> void:\n\t\t\tIEOS.user_info_interface_query_user_info_by_display_name(options)\n\n\t\tstatic func query_user_info_by_external_account(options: QueryUserInfoByExternalAccountOptions) -> void:\n\t\t\tIEOS.user_info_interface_query_user_info_by_external_account(options)\n\n\t\tstatic func copy_best_display_name(options: CopyBestDisplayNameOptions) -> Dictionary:\n\t\t\treturn IEOS.user_info_interface_copy_best_display_name(options)\n\n\t\tstatic func copy_best_display_name_with_platform(options: CopyBestDisplayNameWithPlatformOptions) -> Dictionary:\n\t\t\treturn IEOS.user_info_interface_copy_best_display_name_with_platform(options)\n\n\t\tstatic func get_local_platform_type(options: GetLocalPlatformTypeOptions = GetLocalPlatformTypeOptions.new()) -> OnlinePlatformType:\n\t\t\treturn IEOS.user_info_interface_get_local_platform_type(options)\n\n\n\nclass Logging:\n\tenum LogCategory {\n\t\tCore = 0,\n\t\tAuth = 1,\n\t\tFriends = 2,\n\t\tPresence = 3,\n\t\tUserInfo = 4,\n\t\tHttpSerialization = 5,\n\t\tEcom = 6,\n\t\tP2P = 7,\n\t\tSessions = 8,\n\t\tRateLimiter = 9,\n\t\tPlayerDataStorage = 10,\n\t\tAnalytics = 11,\n\t\tMessaging = 12,\n\t\tConnect = 13,\n\t\tOverlay = 14,\n\t\tAchievements = 15,\n\t\tStats = 16,\n\t\tUi = 17,\n\t\tLobby = 18,\n\t\tLeaderboards = 19,\n\t\tKeychain = 20,\n\t\tIntegratedPlatform = 21,\n\t\tTitleStorage = 22,\n\t\tMods = 23,\n\t\tAntiCheat = 24,\n\t\tReports = 25,\n\t\tSanctions = 26,\n\t\tProgressionSnapshots = 27,\n\t\tKws = 28,\n\t\tRtc = 29,\n\t\tRTCAdmin = 30,\n\t\tCustomInvites = 31,\n\t\tHttp = 41,\n\t\tAllCategories = 0x7fffffff\n\t}\n\n\tenum LogLevel {\n\t\tOff = 0,\n\t\tFatal = 100,\n\t\tError = 200,\n\t\tWarning = 300,\n\t\tInfo = 400,\n\t\tVerbose = 500,\n\t\tVeryVerbose = 600\n\t}\n\n\tclass LogMessage extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"LogMessage\")\n\n\t\tvar category: String\n\t\tvar level: LogLevel\n\t\tvar message: String\n\n\t\tstatic func from(msg_dict: Dictionary) -> LogMessage:\n\t\t\tvar msg = LogMessage.new()\n\t\t\tmsg.category = msg_dict.get(\"category\")\n\t\t\tmsg.level = msg_dict.get(\"level\")\n\t\t\tmsg.message = msg_dict.get(\"message\")\n\t\t\treturn msg\n\n\t\tfunc _to_string() -> String:\n\t\t\treturn \"%s | %s | %s\" % [category, level, message]\n\n\tstatic func set_log_level(log_category: EOS.Logging.LogCategory, log_level: EOS.Logging.LogLevel) -> Result:\n\t\treturn IEOS.logging_interface_set_log_level(log_category, log_level)\n\n\n\nclass TitleStorage:\n\tclass QueryFileOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"QueryFileOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar filename: String\n\n\t\tvar client_data = null\n\n\tclass QueryFileListOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"QueryFileListOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar list_of_tags: Array # [String]\n\n\t\tvar client_data = null\n\n\tclass CopyFileMetadataByFilenameOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"CopyFileMetadataByFilenameOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar filename: String\n\n\tclass GetFileMetadataCountOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"GetFileMetadataCountOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\n\tclass CopyFileMetadataAtIndexOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"CopyFileMetadataAtIndexOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar index: int\n\n\tclass DeleteCacheOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"DeleteCacheOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\n\t\tvar client_data = null\n\n\tclass ReadFileOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"ReadFileOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar filename: String\n\t\tvar read_chunk_length_bytes = 4096\n\n\t\tvar client_data = null\n\n\tclass TitleStorageInterface:\n\t\tstatic func query_file(options: QueryFileOptions) -> void:\n\t\t\tIEOS.titlestorage_interface_query_file(options)\n\n\t\tstatic func query_file_list(options: QueryFileListOptions) -> void:\n\t\t\tIEOS.titlestorage_interface_query_file_list(options)\n\n\t\tstatic func copy_file_metadata_by_filename(options: CopyFileMetadataByFilenameOptions) -> Dictionary:\n\t\t\treturn IEOS.titlestorage_interface_copy_file_metadata_by_filename(options)\n\n\t\tstatic func get_file_metadata_count(options: GetFileMetadataCountOptions) -> int:\n\t\t\treturn IEOS.titlestorage_interface_get_file_metadata_count(options)\n\n\t\tstatic func copy_file_metadata_at_index(options) -> Dictionary:\n\t\t\treturn IEOS.titlestorage_interface_copy_file_metadata_at_index(options)\n\n\t\tstatic func delete_cache(options: DeleteCacheOptions) -> Result:\n\t\t\treturn IEOS.titlestorage_interface_delete_cache(options)\n\n\t\tstatic func read_file(options: ReadFileOptions) -> Variant:\n\t\t\treturn IEOS.titlestorage_interface_read_file(options)\n\n\n\nclass PlayerDataStorage:\n\tclass QueryFileOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"QueryFileOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar filename: String\n\n\t\tvar client_data = null\n\n\tclass QueryFileListOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"QueryFileListOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\n\t\tvar client_data = null\n\n\tclass CopyFileMetadataByFilenameOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"CopyFileMetadataByFilenameOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar filename: String\n\n\tclass GetFileMetadataCountOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"GetFileMetadataCountOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\n\tclass CopyFileMetadataAtIndexOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"CopyFileMetadataAtIndexOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar index: int\n\n\tclass DuplicateFileOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"DuplicateFileOptions\")\n\n\t\tvar destination_filename: String\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar source_filename: String\n\n\t\tvar client_data = null\n\n\tclass DeleteFileOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"DeleteFileOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar filename: String\n\n\t\tvar client_data = null\n\n\tclass DeleteCacheOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"DeleteCacheOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\n\t\tvar client_data = null\n\n\tclass ReadFileOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"ReadFileOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar filename: String\n\t\tvar read_chunk_length_bytes = 4096\n\n\t\tvar client_data = null\n\n\tclass WriteFileOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"WriteFileOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar filename: String\n\n\t\tvar data: PackedByteArray\n\t\tvar chunk_length_bytes = 4096\n\n\t\tvar client_data = null\n\t\tvar written_buffer_length_bytes = 0\n\n\tclass PlayerDataStorageInterface:\n\t\tstatic func query_file(options: QueryFileOptions) -> void:\n\t\t\tIEOS.playerdatastorage_interface_query_file(options)\n\n\t\tstatic func query_file_list(options: QueryFileListOptions) -> void:\n\t\t\tIEOS.playerdatastorage_interface_query_file_list(options)\n\n\t\tstatic func copy_file_metadata_by_filename(options: CopyFileMetadataByFilenameOptions) -> Dictionary:\n\t\t\treturn IEOS.playerdatastorage_interface_copy_file_metadata_by_filename(options)\n\n\t\tstatic func get_file_metadata_count(options: GetFileMetadataCountOptions) -> Dictionary:\n\t\t\treturn IEOS.playerdatastorage_interface_get_file_metadata_count(options)\n\n\t\tstatic func copy_file_metadata_at_index(options) -> Dictionary:\n\t\t\treturn IEOS.playerdatastorage_interface_copy_file_metadata_at_index(options)\n\n\t\tstatic func duplicate_file(options: DuplicateFileOptions) -> void:\n\t\t\tIEOS.playerdatastorage_interface_duplicate_file(options)\n\n\t\tstatic func delete_file(options: DeleteFileOptions) -> void:\n\t\t\tIEOS.playerdatastorage_interface_delete_file(options)\n\n\t\tstatic func delete_cache(options: DeleteCacheOptions) -> Result:\n\t\t\treturn IEOS.playerdatastorage_interface_delete_cache(options)\n\n\t\tstatic func read_file(options: ReadFileOptions) -> Variant:\n\t\t\treturn IEOS.playerdatastorage_interface_read_file(options)\n\n\t\tstatic func write_file(options: WriteFileOptions) -> Variant:\n\t\t\treturn IEOS.playerdatastorage_interface_write_file(options)\n\n\n\nclass Sanctions:\n\tenum AppealReason {\n\t\tInvalid = 0,\n\t\tIncorrectSanction = 1,\n\t\tCompromisedAccount = 2,\n\t\tUnfairPunishment = 3,\n\t\tAppealForForgiveness = 4,\n\t}\n\n\tclass QueryActivePlayerSanctionsOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"QueryActivePlayerSanctionsOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar target_user_id = EOSGRuntime.local_product_user_id\n\n\t\tvar client_data = null\n\n\tclass GetPlayerSanctionCountOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"GetPlayerSanctionCountOptions\")\n\n\t\tvar target_user_id = EOSGRuntime.local_product_user_id\n\n\t\tvar client_data = null\n\n\tclass CopyPlayerSanctionByIndexOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"CopyPlayerSanctionByIndexOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar sanction_index: int\n\t\tvar target_user_id = EOSGRuntime.local_product_user_id\n\n\t\tvar client_data = null\n\n\tclass CreatePlayerSanctionAppealOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"CreatePlayerSanctionAppealOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar reason: AppealReason\n\t\tvar reference_id: String\n\n\t\tvar client_data = null\n\n\tclass SanctionsInterface:\n\t\tstatic func query_active_player_sanctions(options: QueryActivePlayerSanctionsOptions) -> void:\n\t\t\tIEOS.sanctions_interface_query_active_player_sanctions(options)\n\n\t\tstatic func get_player_sanction_count(options: GetPlayerSanctionCountOptions) -> int:\n\t\t\treturn IEOS.sanctions_interface_get_player_sanction_count(options)\n\n\t\tstatic func copy_player_sanction_by_index(options: CopyPlayerSanctionByIndexOptions) -> Variant:\n\t\t\treturn IEOS.sanctions_interface_copy_player_sanction_by_index(options)\n\n\t\tstatic func create_player_sanction_appeal(options: CreatePlayerSanctionAppealOptions) -> void:\n\t\t\tIEOS.sanctions_interface_create_player_sanction_appeal(options)\n\n\n\nclass Sessions:\n\tenum OnlineSessionState {\n\t\tNoSession,\n\t\tCreating,\n\t\tPending,\n\t\tStarting,\n\t\tInProgress,\n\t\tEnding,\n\t\tEnded,\n\t\tDestroying\n\t}\n\n\tenum SessionAttributeAdvertisementType {\n\t\tDontAdvertise,\n\t\tAdvertise\n\t}\n\n\tenum OnlineSessionPermissionLevel {\n\t\tPublicAdvertised,\n\t\tJoinViaPresence,\n\t\tInviteOnly\n\t}\n\n\tconst SEARCH_BUCKET_ID = \"bucket\"\n\tconst SEARCH_EMPTY_SERVERS_ONLY = \"emptyonly\"\n\tconst SEARCH_NONEMPTY_SERVERS_ONLY = \"nonemptyonly\"\n\tconst SEARCH_MINSLOTSAVAILABLE = \"minslotsavailable\"\n\n\tclass CopyActiveSessionDetailsOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"CopyActiveSessionDetailsOptions\")\n\n\t\tvar session_name: String\n\n\tclass CopySessionDetailsByInviteIdOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"CopySessionDetailsByInviteIdOptions\")\n\n\t\tvar invite_id: String\n\n\tclass CopySessionDetailsByUiEventIdOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"CopySessionDetailsByUiEventIdOptions\")\n\n\t\tvar ui_event_id: String\n\n\tclass CopySessionDetailsForPresenceOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"CopySessionDetailsForPresenceOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\n\tclass CreateSessionModificationOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"CreateSessionModificationOptions\")\n\n\t\tvar allowed_platform_ids = [] # Array[int]\n\t\tvar bucket_id: String\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar max_players: int\n\t\tvar presence_enabled: bool\n\t\tvar sanctions_enabled: bool\n\t\tvar session_id: String\n\t\tvar session_name: String\n\n\tclass CreateSessionSearchOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"CreateSessionSearchOptions\")\n\n\t\tvar max_search_results := 10\n\n\tclass GetInviteIdByIndexOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"GetInviteIdByIndexOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar index: int\n\n\tclass UpdateSessionModificationOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"UpdateSessionModificationOptions\")\n\n\t\tvar session_name: String\n\n\tclass DumpSessionStateOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"DumpSessionStateOptions\")\n\n\t\tvar session_name: String\n\n\tclass GetInviteCountOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"GetInviteCountOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\n\tclass IsUserInSessionOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"IsUserInSessionOptions\")\n\n\t\tvar session_name: String\n\t\tvar target_user_id = EOSGRuntime.local_product_user_id\n\n\tclass DestroySessionOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"DestroySessionOptions\")\n\n\t\tvar session_name: String\n\n\t\tvar client_data = null\n\n\tclass EndSessionOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"EndSessionOptions\")\n\n\t\tvar session_name: String\n\n\t\tvar client_data = null\n\n\tclass JoinSessionOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"JoinSessionOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar presence_enabled: bool\n\t\tvar session_details: EOSGSessionDetails\n\t\tvar session_name: String\n\n\t\tvar client_data = null\n\n\tclass QueryInvitesOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"QueryInvitesOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\n\t\tvar client_data = null\n\n\tclass RegisterPlayersOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"RegisterPlayersOptions\")\n\n\t\tvar session_name: String\n\t\tvar players_to_register: Array # Array[String]\n\n\t\tvar client_data = null\n\n\tclass RejectInviteOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"RejectInviteOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar invite_id: String\n\n\t\tvar client_data = null\n\n\tclass SendInviteOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"SendInviteOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar session_name: String\n\t\tvar target_user_id: String\n\n\t\tvar client_data = null\n\n\tclass StartSessionOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"StartSessionOptions\")\n\n\t\tvar session_name: String\n\n\t\tvar client_data = null\n\n\tclass UnregisterPlayersOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"UnregisterPlayersOptions\")\n\n\t\tvar session_name: String\n\t\tvar players_to_unregister: Array # Array[String]\n\n\t\tvar client_data = null\n\n\tclass UpdateSessionOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"UpdateSessionOptions\")\n\n\t\tvar session_modification: EOSGSessionModification\n\n\t\tvar client_data = null\n\n\tclass SessionsInterface:\n\t\tstatic func copy_active_session_details(options: CopyActiveSessionDetailsOptions) -> Dictionary:\n\t\t\treturn IEOS.sessions_interface_copy_active_session_details(options)\n\n\t\tstatic func copy_session_details_by_invite_id(options: CopySessionDetailsByInviteIdOptions) -> Dictionary:\n\t\t\treturn IEOS.sessions_interface_copy_session_details_by_invite_id(options)\n\n\t\tstatic func copy_session_details_by_ui_event_id(options: CopySessionDetailsByUiEventIdOptions) -> Dictionary:\n\t\t\treturn IEOS.sessions_interface_copy_session_details_by_ui_event_id(options)\n\n\t\tstatic func copy_session_details_for_presence(options: CopySessionDetailsForPresenceOptions) -> Dictionary:\n\t\t\treturn IEOS.sessions_interface_copy_session_details_for_presence(options)\n\n\t\tstatic func create_session_modification(options: CreateSessionModificationOptions) -> Dictionary:\n\t\t\treturn IEOS.sessions_interface_create_session_modification(options)\n\n\t\tstatic func create_session_search(options: CreateSessionSearchOptions) -> Dictionary:\n\t\t\treturn IEOS.sessions_interface_create_session_search(options)\n\n\t\tstatic func get_invite_id_by_index(options: GetInviteIdByIndexOptions) -> Dictionary:\n\t\t\treturn IEOS.sessions_interface_get_invite_id_by_index(options)\n\n\t\tstatic func update_session_modification(options: UpdateSessionModificationOptions) -> Dictionary:\n\t\t\treturn IEOS.sessions_interface_update_session_modification(options)\n\n\t\tstatic func dump_session_state(options: DumpSessionStateOptions) -> int:\n\t\t\treturn IEOS.sessions_interface_dump_session_state(options)\n\n\t\tstatic func get_invite_count(options: GetInviteCountOptions) -> int:\n\t\t\treturn IEOS.sessions_interface_get_invite_count(options)\n\n\t\tstatic func is_user_in_session(options: IsUserInSessionOptions) -> int:\n\t\t\treturn IEOS.sessions_interface_is_user_in_session(options)\n\n\t\tstatic func destroy_session(options: DestroySessionOptions) -> void:\n\t\t\tIEOS.sessions_interface_destroy_session(options)\n\n\t\tstatic func end_session(options: EndSessionOptions) -> void:\n\t\t\tIEOS.sessions_interface_end_session(options)\n\n\t\tstatic func join_session(options: JoinSessionOptions) -> void:\n\t\t\tIEOS.sessions_interface_join_session(options)\n\n\t\tstatic func query_invites(options: QueryInvitesOptions) -> void:\n\t\t\tIEOS.sessions_interface_query_invites(options)\n\n\t\tstatic func register_players(options: RegisterPlayersOptions) -> void:\n\t\t\tIEOS.sessions_interface_register_players(options)\n\n\t\tstatic func reject_invite(options: RejectInviteOptions) -> void:\n\t\t\tIEOS.sessions_interface_reject_invite(options)\n\n\t\tstatic func send_invite(options: SendInviteOptions) -> void:\n\t\t\tIEOS.sessions_interface_send_invite(options)\n\n\t\tstatic func start_session(options: StartSessionOptions) -> void:\n\t\t\tIEOS.sessions_interface_start_session(options)\n\n\t\tstatic func unregister_players(options: UnregisterPlayersOptions) -> void:\n\t\t\tIEOS.sessions_interface_unregister_players(options)\n\n\t\tstatic func update_session(options: UpdateSessionOptions) -> void:\n\t\t\tIEOS.sessions_interface_update_session(options)\n\n\n\nclass RTC:\n\tenum ParticipantStatus {\n\t\tJoined,\n\t\tLeft,\n\t}\n\n\tenum JoinRoomFlags {\n\t\tEnableEcho = 0x01,\n\t\tEnableDataChannel = 0x04\n\t}\n\n\tclass AddNotifyDisconnectedOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"AddNotifyDisconnectedOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar room_name: String\n\n\tclass AddNotifyParticipantStatusChangedOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"AddNotifyParticipantStatusChangedOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar room_name: String\n\n\tclass AddNotifyRoomStatisticsUpdatedOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"AddNotifyRoomStatisticsUpdatedOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar room_name: String\n\n\tclass SetRoomSettingOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"SetRoomSettingOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar room_name: String\n\t\tvar setting_key: String\n\t\tvar setting_value: String\n\n\tclass SetSettingOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"SetSettingOptions\")\n\n\t\tvar setting_key: String\n\t\tvar setting_value: String\n\n\tclass BlockParticipantOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"BlockParticipantOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar room_name: String\n\t\tvar participant_id: String\n\t\tvar blocked: bool\n\n\t\tvar client_data = null\n\n\tclass JoinRoomOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"JoinRoomOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar room_name: String\n\t\tvar client_base_url: String\n\t\tvar participant_token: String\n\t\tvar participant_id: String\n\t\tvar flags: int # JoinRoomFlags\n\t\tvar manual_audio_input_enabled: bool\n\t\tvar manual_audio_output_enabled: bool\n\n\t\tvar client_data = null\n\n\tclass LeaveRoomOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"LeaveRoomOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar room_name: String\n\n\t\tvar client_data = null\n\n\tclass RTCInterface:\n\t\tstatic func add_notify_disconnected(options: AddNotifyDisconnectedOptions) -> int:\n\t\t\treturn IEOS.rtc_interface_add_notify_disconnected(options)\n\n\t\tstatic func add_notify_participant_status_changed(options: AddNotifyParticipantStatusChangedOptions) -> int:\n\t\t\treturn IEOS.rtc_interface_add_notify_participant_status_changed(options)\n\n\t\tstatic func add_notify_room_statistics_updated(options: AddNotifyRoomStatisticsUpdatedOptions) -> int:\n\t\t\treturn IEOS.rtc_interface_add_notify_room_statistics_updated(options)\n\n\t\tstatic func set_room_setting(options: SetRoomSettingOptions) -> int:\n\t\t\treturn IEOS.rtc_interface_set_room_setting(options)\n\n\t\tstatic func set_setting(options: SetSettingOptions) -> int:\n\t\t\treturn IEOS.rtc_interface_set_setting(options)\n\n\t\tstatic func block_participant(options: BlockParticipantOptions) -> void:\n\t\t\tIEOS.rtc_interface_block_participant(options)\n\n\t\tstatic func join_room(options: JoinRoomOptions) -> void:\n\t\t\tIEOS.rtc_interface_join_room(options)\n\n\t\tstatic func leave_room(options: LeaveRoomOptions) -> void:\n\t\t\tIEOS.rtc_interface_leave_room(options)\n\n\t\tstatic func remove_notify_disconnected(notification_id: int) -> void:\n\t\t\tIEOS.rtc_interface_remove_notify_disconnected(notification_id)\n\n\t\tstatic func remove_notify_participant_status_changed(notification_id: int) -> void:\n\t\t\tIEOS.rtc_interface_remove_notify_participant_status_changed(notification_id)\n\n\t\tstatic func remove_notify_room_statistics_updated(notification_id: int) -> void:\n\t\t\tIEOS.rtc_interface_remove_notify_room_statistics_updated(notification_id)\n\n\n\nclass RTCAudio:\n\tenum AudioStatus {\n\t\t## Audio unsupported by the source (no devices)\n\t\tUnsupported = 0,\n\t\t## Audio enabled\n\t\tEnabled = 1,\n\t\t## Audio disabled\n\t\tDisabled = 2,\n\t\t## Audio disabled by the administrator\n\t\tAdminDisabled = 3,\n\t\t## Audio channel is disabled temporarily for both sending and receiving\n\t\tNotListeningDisabled = 4\n\t}\n\n\tenum AudioInputStatus {\n\t\t## The device is not in used right now (e.g: you are alone in the room). In such cases, the hardware resources are not allocated.\n\t\tIdle = 0,\n\t\t## The device is being used and capturing audio\n\t\tRecording = 1,\n\t\t## The SDK is in a recording state, but actually capturing silence because the device is exclusively being used by the platform at the moment.\n\t\t## This only applies to certain platforms.\n\t\tRecordingSilent = 2,\n\t\t## The SDK is in a recording state, but actually capturing silence because the device is disconnected (e.g: the microphone is not plugged in).\n\t\t## This only applies to certain platforms.\n\t\tRecordingDisconnected = 3,\n\t\t## Something failed while trying to use the device\n\t\tFailed = 4\n\t}\n\n\tenum AudioOutputStatus {\n\t\t## The device is not in used right now (e.g: you are alone in the room). In such cases, the hardware resources are not allocated.\n\t\tIdle = 0,\n\t\t## Device is in use\n\t\tPlaying = 1,\n\t\t## Something failed while trying to use the device\n\t\tFailed = 2\n\t}\n\n\tclass CopyInputDeviceInformationByIndexOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"CopyInputDeviceInformationByIndexOptions\")\n\n\t\tvar device_index: int\n\n\tclass CopyOutputDeviceInformationByIndexOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"CopyOutputDeviceInformationByIndexOptions\")\n\n\t\tvar device_index: int\n\n\tclass AddNotifyAudioBeforeRenderOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"AddNotifyAudioBeforeRenderOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar room_name: String\n\t\tvar unmixed_audio: bool\n\n\tclass AddNotifyAudioBeforeSendOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"AddNotifyAudioBeforeSendOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar room_name: String\n\n\tclass AddNotifyAudioInputStateOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"AddNotifyAudioInputStateOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar room_name: String\n\n\tclass AddNotifyAudioOutputStateOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"AddNotifyAudioOutputStateOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar room_name: String\n\n\tclass AddNotifyParticipantUpdatedOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"AddNotifyParticipantUpdatedOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar room_name: String\n\n\tclass GetInputDevicesCountOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"GetInputDevicesCountOptions\")\n\n\tclass GetOutputDevicesCountOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"GetOutputDevicesCountOptions\")\n\n\tclass SendAudioOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"SendAudioOptions\")\n\n\t\tvar local_user_id: String = HAuth.product_user_id\n\t\tvar room_name: String\n\t\tvar frames: PackedInt32Array\n\t\tvar sample_rate = 48000\n\t\tvar channels = 1\n\t\t\n\n\tclass QueryInputDevicesInformationOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"QueryInputDevicesInformationOptions\")\n\n\t\t\tvar client_data = null\n\n\tclass QueryOutputDevicesInformationOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"QueryOutputDevicesInformationOptions\")\n\n\t\tvar client_data = null\n\n\tclass RegisterPlatformUserOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"RegisterPlatformUserOptions\")\n\n\t\tvar platform_user_id: String\n\n\t\tvar client_data = null\n\n\tclass SetInputDeviceSettingsOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"SetInputDeviceSettingsOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar real_device_id: String\n\t\tvar platform_aec: bool\n\n\t\tvar client_data = null\n\n\tclass SetOutputDeviceSettingsOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"SetOutputDeviceSettingsOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar real_device_id: String\n\n\t\tvar client_data = null\n\n\tclass UnregisterPlatformUserOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"UnregisterPlatformUserOptions\")\n\n\t\tvar platform_user_id: String\n\n\t\tvar client_data = null\n\n\tclass UpdateParticipantVolumeOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"UpdateParticipantVolumeOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar room_name: String\n\t\tvar participant_id: String\n\t\tvar volume: float\n\n\t\tvar client_data = null\n\n\tclass UpdateReceivingOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"UpdateReceivingOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar room_name: String\n\t\tvar participant_id: String\n\t\tvar audio_enabled: bool\n\n\t\tvar client_data = null\n\n\tclass UpdateReceivingVolumeOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"UpdateReceivingVolumeOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar room_name: String\n\t\tvar participant_id: String\n\t\tvar volume: float\n\n\t\tvar client_data = null\n\n\tclass UpdateSendingOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"UpdateSendingOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar room_name: String\n\t\tvar audio_status: AudioStatus\n\n\t\tvar client_data = null\n\n\tclass UpdateSendingVolumeOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"UpdateSendingVolumeOptions\")\n\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar room_name: String\n\t\tvar volume: float\n\n\t\tvar client_data = null\n\n\tclass RTCAudioInterface:\n\t\tstatic func copy_input_device_information_by_index(options: CopyInputDeviceInformationByIndexOptions) -> Dictionary:\n\t\t\treturn IEOS.rtc_audio_interface_copy_input_device_information_by_index(options)\n\n\t\tstatic func copy_output_device_information_by_index(options: CopyOutputDeviceInformationByIndexOptions) -> Dictionary:\n\t\t\treturn IEOS.rtc_audio_interface_copy_output_device_information_by_index(options)\n\n\t\tstatic func add_notify_audio_before_render(options: AddNotifyAudioBeforeRenderOptions) -> int:\n\t\t\treturn IEOS.rtc_audio_interface_add_notify_audio_before_render(options)\n\n\t\tstatic func add_notify_audio_before_send(options: AddNotifyAudioBeforeSendOptions) -> int:\n\t\t\treturn IEOS.rtc_audio_interface_add_notify_audio_before_send(options)\n\n\t\tstatic func add_notify_audio_input_state(options: AddNotifyAudioInputStateOptions) -> int:\n\t\t\treturn IEOS.rtc_audio_interface_add_notify_audio_input_state(options)\n\n\t\tstatic func add_notify_audio_output_state(options: AddNotifyAudioOutputStateOptions) -> int:\n\t\t\treturn IEOS.rtc_audio_interface_add_notify_audio_output_state(options)\n\n\t\tstatic func add_notify_participant_updated(options: AddNotifyParticipantUpdatedOptions) -> int:\n\t\t\treturn IEOS.rtc_audio_interface_add_notify_participant_updated(options)\n\n\t\tstatic func get_input_devices_count(options := GetInputDevicesCountOptions.new()) -> int:\n\t\t\treturn IEOS.rtc_audio_interface_get_input_devices_count(options)\n\n\t\tstatic func get_output_devices_count(options := GetOutputDevicesCountOptions.new()) -> int:\n\t\t\treturn IEOS.rtc_audio_interface_get_output_devices_count(options)\n\n\t\tstatic func send_audio(options: SendAudioOptions) -> int:\n\t\t\treturn IEOS.rtc_audio_interface_send_audio(options)\n\n\t\tstatic func query_input_devices_information(options := QueryInputDevicesInformationOptions.new()) -> void:\n\t\t\tIEOS.rtc_audio_interface_query_input_devices_information(options)\n\n\t\tstatic func query_output_devices_information(options := QueryOutputDevicesInformationOptions.new()) -> void:\n\t\t\tIEOS.rtc_audio_interface_query_output_devices_information(options)\n\n\t\tstatic func register_platform_user(options: RegisterPlatformUserOptions) -> void:\n\t\t\tIEOS.rtc_audio_interface_register_platform_user(options)\n\n\t\tstatic func remove_notify_audio_before_render(notification_id: int) -> void:\n\t\t\tIEOS.rtc_audio_interface_remove_notify_audio_before_render(notification_id)\n\n\t\tstatic func remove_notify_audio_before_send(notification_id: int) -> void:\n\t\t\tIEOS.rtc_audio_interface_remove_notify_audio_before_send(notification_id)\n\n\t\tstatic func remove_notify_audio_input_state(notification_id: int) -> void:\n\t\t\tIEOS.rtc_audio_interface_remove_notify_audio_input_state(notification_id)\n\n\t\tstatic func remove_notify_audio_output_state(notification_id: int) -> void:\n\t\t\tIEOS.rtc_audio_interface_remove_notify_audio_output_state(notification_id)\n\n\t\tstatic func remove_notify_participant_updated(notification_id: int) -> void:\n\t\t\tIEOS.rtc_audio_interface_remove_notify_participant_updated(notification_id)\n\n\t\tstatic func set_input_device_settings(options: SetInputDeviceSettingsOptions) -> void:\n\t\t\tIEOS.rtc_audio_interface_set_input_device_settings(options)\n\n\t\tstatic func set_output_device_settings(options: SetOutputDeviceSettingsOptions) -> void:\n\t\t\tIEOS.rtc_audio_interface_set_output_device_settings(options)\n\n\t\tstatic func unregister_platform_user(options: UnregisterPlatformUserOptions) -> void:\n\t\t\tIEOS.rtc_audio_interface_unregister_platform_user(options)\n\n\t\tstatic func update_participant_volume(options: UpdateParticipantVolumeOptions) -> void:\n\t\t\tIEOS.rtc_audio_interface_update_participant_volume(options)\n\n\t\tstatic func update_receiving(options: UpdateReceivingOptions) -> void:\n\t\t\tIEOS.rtc_audio_interface_update_receiving(options)\n\n\t\tstatic func update_receiving_volume(options: UpdateReceivingVolumeOptions) -> void:\n\t\t\tIEOS.rtc_audio_interface_update_receiving_volume(options)\n\n\t\tstatic func update_sending(options: UpdateSendingOptions) -> void:\n\t\t\tIEOS.rtc_audio_interface_update_sending(options)\n\n\t\tstatic func update_sending_volume(options: UpdateSendingVolumeOptions) -> void:\n\t\t\tIEOS.rtc_audio_interface_update_sending_volume(options)\n\n\nclass RTCData:\n\tconst MAX_PACKET_SIZE_BYTES = 1170\n\n\tenum DataStatus {\n\t\t## Data unsupported\n\t\tUnsupported = 0,\n\t\t## Data enabled\n\t\tEnabled = 1,\n\t\t## Data disabled\n\t\tDisabled = 2\n\t}\n\t\n\tclass AddNotifyDataReceivedOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"AddNotifyDataReceivedOptions\")\n\t\t\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar room_name: String\n\n\tclass AddNotifyParticipantUpdatedOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"AddNotifyParticipantUpdatedOptions\")\n\t\t\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar room_name: String\n\n\tclass SendDataOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"SendDataOptions\")\n\t\t\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar room_name: String\n\t\tvar data: PackedByteArray\n\t\n\tclass UpdateReceivingOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"UpdateReceivingOptions\")\n\t\t\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar room_name: String\n\t\tvar participant_id: String\n\t\tvar data_enabled: bool\n\t\n\tclass UpdateSendingOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"UpdateSendingOptions\")\n\t\t\n\t\tvar local_user_id = EOSGRuntime.local_product_user_id\n\t\tvar room_name: String\n\t\tvar data_enabled: bool\n\n\tclass RTCDataInterface:\n\t\tstatic func add_notify_data_received(options: AddNotifyDataReceivedOptions) -> int:\n\t\t\treturn IEOS.rtc_data_interface_add_notify_data_received(options);\n\t\t\n\t\tstatic func add_notify_participant_updated(options: AddNotifyParticipantUpdatedOptions) -> int:\n\t\t\treturn IEOS.rtc_data_interface_add_notify_participant_updated(options);\n\t\t\n\t\tstatic func send_data(options: SendDataOptions) -> EOS.Result:\n\t\t\treturn IEOS.rtc_data_interface_send_data(options);\n\t\t\n\t\tstatic func remove_notify_data_received(notification_id: int) -> void:\n\t\t\tIEOS.rtc_data_interface_remove_notify_data_received(notification_id)\n\t\t\n\t\tstatic func remove_notify_participant_updated(notification_id: int) -> void:\n\t\t\tIEOS.rtc_data_interface_remove_notify_participant_updated(notification_id)\n\t\t\n\t\tstatic func update_receiving(options: UpdateReceivingOptions) -> void:\n\t\t\tIEOS.rtc_data_interface_update_receiving(options);\n\t\t\n\t\tstatic func update_sending(options: UpdateSendingOptions) -> void:\n\t\t\tIEOS.rtc_data_interface_update_sending(options);\n\n\nclass AntiCheatServer:\n\tclass BeginSessionOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"BeginSessionOptions\")\n\n\t\tvar register_timeout_seconds := 60\n\t\tvar server_name: String\n\t\tvar local_user_id: String\n\t\tvar enable_gameplay_data: bool\n\n\tclass EndSessionOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"EndSessionOptions\")\n\n\tclass RegisterClientOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"RegisterClientOptions\")\n\n\t\tvar client_handle: String\n\t\tvar client_type: AntiCheatCommonClientType\n\t\tvar client_platform: AntiCheatCommonClientPlatform\n\t\tvar ip_address: String\n\t\tvar user_id: String\n\n\tclass UnregisterClientOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"UnregisterClientOptions\")\n\n\t\tvar client_handle: String\n\n\tclass ReceiveMessageFromClientOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"ReceiveMessageFromClientOptions\")\n\n\t\tvar client_handle: String\n\t\tvar data: PackedByteArray\n\n\tclass SetClientDetailsOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"SetClientDetailsOptions\")\n\n\t\tvar client_handle: String\n\t\tvar client_flags: AntiCheatCommonClientFlags\n\t\tvar client_input: AntiCheatCommonClientInput\n\n\tclass SetGameSessionIdOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"SetGameSessionIdOptions\")\n\n\t\tvar game_session_id: String\n\n\tclass SetClientNetworkStateOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"SetClientNetworkStateOptions\")\n\n\t\tvar client_handle: String\n\t\tvar is_network_active: bool\n\n\tclass GetProtectMessageOutputLengthOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"GetProtectMessageOutputLengthOptions\")\n\n\t\tvar data_length_bytes: int\n\n\tclass ProtectMessageOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"ProtectMessageOptions\")\n\n\t\tvar client_handle: String\n\t\tvar data: PackedByteArray\n\t\tvar out_buffer_size_bytes: int\n\n\tclass UnprotectMessageOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"UnprotectMessageOptions\")\n\n\t\tvar client_handle: String\n\t\tvar data: PackedByteArray\n\t\tvar out_buffer_size_bytes: int\n\n\tclass RegisterEventOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"RegisterEventOptions\")\n\n\t\tvar event_id: String\n\t\tvar event_name: String\n\t\tvar event_type: AntiCheatCommonEventType\n\t\tvar param_defs: Array # {param_type: AntiCheatCommonEventParamType, param_name: String}\n\n\tclass LogEventOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"LogEventOptions\")\n\n\t\tvar client_handle: String\n\t\tvar event_id: String\n\t\tvar params: Array # Supported types int, String, Vector3, float, Quaternion\n\n\tclass LogGameRoundStartOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"LogGameRoundStartOptions\")\n\n\t\tvar session_identifier: String\n\t\tvar level_name: String\n\t\tvar mode_name: String\n\t\tvar round_time_seconds: int\n\t\tvar competition_type: AntiCheatCommonGameRoundCompetitionType\n\n\tclass LogGameRoundEndOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"LogGameRoundEndOptions\")\n\n\t\tvar winning_team_id: String\n\n\tclass LogPlayerSpawnOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"LogPlayerSpawnOptions\")\n\n\t\tvar spawned_player_handle: String\n\t\tvar team_id: String\n\t\tvar character_id: String\n\n\tclass LogPlayerDespawnOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"LogPlayerDespawnOptions\")\n\n\t\tvar despawned_player_handle: String\n\n\tclass LogPlayerReviveOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"LogPlayerReviveOptions\")\n\n\t\tvar revived_player_handle: String\n\t\tvar reviver_player_handle: String\n\n\tclass LogPlayerTickOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"LogPlayerTickOptions\")\n\n\t\tvar player_handle: String\n\t\tvar player_position: Vector3\n\t\tvar player_view_rotation: Quaternion\n\t\tvar player_health: float\n\t\tvar player_movement_state: AntiCheatCommonPlayerMovementState\n\t\tvar player_view_position: Vector3\n\t\tvar is_player_view_zoomed: bool\n\n\tclass LogPlayerUseWeaponOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"LogPlayerUseWeaponOptions\")\n\n\t\tvar player_handle: String\n\t\tvar player_position: Vector3\n\t\tvar player_view_rotation: Quaternion\n\t\tvar weapon_name: String\n\t\tvar is_player_view_zoomed: bool\n\t\tvar is_melee_attacK: bool\n\n\tclass LogPlayerUseAbilityOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"LogPlayerUseAbilityOptions\")\n\n\t\tvar player_handle: String\n\t\tvar ability_id: int\n\t\tvar ability_duration_ms: int\n\t\tvar ability_cooldown_ms: int\n\n\tclass LogPlayerTakeDamageOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"LogPlayerTakeDamageOptions\")\n\n\t\tvar victim_player_handle: String\n\t\tvar victim_player_position: Vector3\n\t\tvar victim_player_view_rotation: Quaternion\n\n\t\tvar attacker_player_handle: String\n\t\tvar attacker_player_position: Vector3\n\t\tvar attacker_player_view_rotation: Quaternion\n\n\t\tvar damage_taken: float\n\t\tvar health_remaining: float\n\t\tvar damage_source: AntiCheatCommonPlayerTakeDamageSource\n\t\tvar damage_type: AntiCheatCommonPlayerTakeDamageType\n\t\tvar damage_result: AntiCheatCommonPlayerTakeDamageResult\n\t\tvar tim_since_player_use_weapon_ms: int\n\t\tvar damage_position: Vector3\n\t\tvar attacked_player_view_position: Vector3\n\t\tvar player_use_weapon_data: LogPlayerUseWeaponOptions\n\n\t\tvar is_hitscan_attack: bool\n\t\tvar has_line_of_sight: bool\n\t\tvar is_critical_hit: bool\n\n\tclass AntiCheatServerInterface:\n\t\tstatic func begin_session(options: BeginSessionOptions) -> EOS.Result:\n\t\t\treturn IEOS.anticheat_server_interface_begin_session(options)\n\n\t\tstatic func end_session() -> EOS.Result:\n\t\t\treturn IEOS.anticheat_server_interface_end_session(EndSessionOptions.new())\n\n\t\tstatic func register_client(options: RegisterClientOptions) -> EOS.Result:\n\t\t\treturn IEOS.anticheat_server_interface_register_client(options)\n\n\t\tstatic func unregister_client(options: UnregisterClientOptions) -> EOS.Result:\n\t\t\treturn IEOS.anticheat_server_interface_unregister_client(options)\n\n\t\tstatic func receive_message_from_client(options: ReceiveMessageFromClientOptions) -> EOS.Result:\n\t\t\treturn IEOS.anticheat_server_interface_receive_message_from_client(options)\n\n\t\tstatic func set_client_details(options: SetClientDetailsOptions) -> EOS.Result:\n\t\t\treturn IEOS.anticheat_server_interface_set_client_details(options)\n\n\t\tstatic func set_game_session_id(options: SetGameSessionIdOptions) -> EOS.Result:\n\t\t\treturn IEOS.anticheat_server_interface_set_game_session_id(options)\n\n\t\tstatic func set_client_network_state(options: SetClientNetworkStateOptions) -> EOS.Result:\n\t\t\treturn IEOS.anticheat_server_interface_set_client_network_state(options)\n\n\t\tstatic func get_protect_message_output_length(options: GetProtectMessageOutputLengthOptions) -> Dictionary:\n\t\t\treturn IEOS.anticheat_server_interface_get_protect_message_output_length(options)\n\n\t\tstatic func protect_message(options: ProtectMessageOptions) -> Dictionary:\n\t\t\treturn IEOS.anticheat_server_interface_protect_message(options)\n\n\t\tstatic func unprotect_message(options: UnprotectMessageOptions) -> Dictionary:\n\t\t\treturn IEOS.anticheat_server_interface_unprotect_message(options)\n\n\t\tstatic func register_event(options: RegisterEventOptions) -> EOS.Result:\n\t\t\treturn IEOS.anticheat_server_interface_register_event(options)\n\n\t\tstatic func log_event(options: LogEventOptions) -> EOS.Result:\n\t\t\treturn IEOS.anticheat_server_interface_log_event(options)\n\n\t\tstatic func log_game_round_start(options: LogGameRoundStartOptions) -> EOS.Result:\n\t\t\treturn IEOS.anticheat_server_interface_log_game_round_start(options)\n\n\t\tstatic func log_game_round_end(options: LogGameRoundEndOptions) -> EOS.Result:\n\t\t\treturn IEOS.anticheat_server_interface_log_game_round_end(options)\n\n\t\tstatic func log_player_spawn(options: LogPlayerSpawnOptions) -> EOS.Result:\n\t\t\treturn IEOS.anticheat_server_interface_log_player_spawn(options)\n\n\t\tstatic func log_player_despawn(options: LogPlayerDespawnOptions) -> EOS.Result:\n\t\t\treturn IEOS.anticheat_server_interface_log_player_despawn(options)\n\n\t\tstatic func log_player_revive(options: LogPlayerReviveOptions) -> EOS.Result:\n\t\t\treturn IEOS.anticheat_server_interface_log_player_revive(options)\n\n\t\tstatic func log_player_tick(options: LogPlayerTickOptions) -> EOS.Result:\n\t\t\treturn IEOS.anticheat_server_interface_log_player_tick(options)\n\n\t\tstatic func log_player_use_weapon(options: LogPlayerUseWeaponOptions) -> EOS.Result:\n\t\t\treturn IEOS.anticheat_server_interface_log_player_use_weapon(options)\n\n\t\tstatic func log_player_use_ability(options: LogPlayerUseAbilityOptions) -> EOS.Result:\n\t\t\treturn IEOS.anticheat_server_interface_log_player_use_ability(options)\n\n\t\tstatic func log_player_take_damage(options: LogPlayerTakeDamageOptions) -> EOS.Result:\n\t\t\treturn IEOS.anticheat_server_interface_log_player_take_damage(options)\n\n\n\nclass AntiCheatClient:\n\tclass BeginSessionOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"BeginSessionOptions\")\n\n\t\tvar local_user_id: String\n\t\tvar mode: AntiCheatClientMode\n\n\tclass EndSessionOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"EndSessionOptions\")\n\n\tclass AddExternalIntegrityCatalogOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"AddExternalIntegrityCatalogOptions\")\n\n\t\tvar path_to_file_bin: String\n\n\tclass ReceiveMessageFromServerOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"ReceiveMessageFromServerOptions\")\n\n\t\tvar data: PackedByteArray\n\n\tclass GetProtectMessageOutputLengthOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"GetProtectMessageOutputLengthOptions\")\n\n\t\tvar data_length_bytes: int\n\n\tclass ProtectMessageOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"ProtectMessageOptions\")\n\n\t\tvar data: PackedByteArray\n\t\tvar out_buffer_size_bytes: int\n\n\tclass UnprotectMessageOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"UnprotectMessageOptions\")\n\n\t\tvar data: PackedByteArray\n\t\tvar out_buffer_size_bytes: int\n\n\tclass RegisterPeerOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"RegisterPeerOptions\")\n\n\t\tvar peer_handle: String\n\t\tvar client_type: AntiCheatCommonClientType\n\t\tvar client_platform: AntiCheatCommonClientPlatform\n\t\tvar authentication_timeout: int = 60\n\t\tvar ip_address: String\n\t\tvar peer_product_user_id: String\n\n\tclass UnregisterPeerOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"UnregisterPeerOptions\")\n\n\t\tvar peer_handle: String\n\n\tclass ReceiveMessageFromPeerOptions extends BaseClass:\n\t\tfunc _init():\n\t\t\tsuper._init(\"ReceiveMessageFromPeerOptions\")\n\n\t\tvar peer_handle: String\n\t\tvar data: PackedByteArray\n\n\tclass AntiCheatClientInterface:\n\t\tstatic func begin_session(options: BeginSessionOptions) -> EOS.Result:\n\t\t\treturn IEOS.anticheat_client_interface_begin_session(options)\n\n\t\tstatic func end_session() -> EOS.Result:\n\t\t\treturn IEOS.anticheat_client_interface_end_session(EndSessionOptions.new())\n\n\t\tstatic func add_external_integrity_catalog(options: AddExternalIntegrityCatalogOptions) -> EOS.Result:\n\t\t\treturn IEOS.anticheat_client_interface_add_external_integrity_catalog(options)\n\n\t\tstatic func receive_message_from_server(options: ReceiveMessageFromServerOptions) -> EOS.Result:\n\t\t\treturn IEOS.anticheat_client_interface_receive_message_from_server(options)\n\n\t\tstatic func get_protect_message_output_length(options: GetProtectMessageOutputLengthOptions) -> Dictionary:\n\t\t\treturn IEOS.anticheat_client_interface_get_protect_message_output_length(options)\n\n\t\tstatic func protect_message(options: ProtectMessageOptions) -> Dictionary:\n\t\t\treturn IEOS.anticheat_client_interface_protect_message(options)\n\n\t\tstatic func unprotect_message(options: UnprotectMessageOptions) -> Dictionary:\n\t\t\treturn IEOS.anticheat_client_interface_unprotect_message(options)\n\n\t\tstatic func register_peer(options: RegisterPeerOptions) -> EOS.Result:\n\t\t\treturn IEOS.anticheat_client_interface_register_peer(options)\n\n\t\tstatic func unregister_peer(options: UnregisterPeerOptions) -> EOS.Result:\n\t\t\treturn IEOS.anticheat_client_interface_unregister_peer(options)\n\n\t\tstatic func receive_message_from_peer(options: ReceiveMessageFromPeerOptions) -> EOS.Result:\n\t\t\treturn IEOS.anticheat_client_interface_receive_message_from_peer(options)\n\n\nclass Version:\n\tclass VersionInterface:\n\t\tstatic func get_version() -> String:\n\t\t\treturn IEOS.version_interface_get_version()\n\n\t\tstatic func get_constants() -> Dictionary:\n\t\t\treturn IEOS.version_interface_get_constants()\n\n\n\nconst NotificationIdInvalid = 0\n\n\nenum Result {\n\tSuccess = 0,\n\tNoConnection = 1,\n\tInvalidCredentials = 2,\n\tInvalidUser = 3,\n\tInvalidAuth = 4,\n\tAccessDenied = 5,\n\tMissingPermissions = 6,\n\tTokenNotAccount = 7,\n\tTooManyRequests = 8,\n\tAlreadyPending = 9,\n\tInvalidParameters = 10,\n\tInvalidRequest = 11,\n\tUnrecognizedResponse = 12,\n\tIncompatibleVersion = 13,\n\tNotConfigured = 14,\n\tAlreadyConfigured = 15,\n\tNotImplemented = 16,\n\tCanceled = 17,\n\tNotFound = 18,\n\tOperationWillRetry = 19,\n\tNoChange = 20,\n\tVersionMismatch = 21,\n\tLimitExceeded = 22,\n\tDisabled = 23,\n\tDuplicateNotAllowed = 24,\n\tInvalidSandboxId = 26,\n\tTimedOut = 27,\n\tPartialResult = 28,\n\tMissingRole = 29,\n\tMissingFeature = 30,\n\tInvalidSandbox = 31,\n\tInvalidDeployment = 32,\n\tInvalidProduct = 33,\n\tInvalidProductUserID = 34,\n\tServiceFailure = 35,\n\tCacheDirectoryMissing = 36,\n\tCacheDirectoryInvalid = 37,\n\tInvalidState = 38,\n\tRequestInProgress = 39,\n\tApplicationSuspended = 40,\n\tNetworkDisconnected = 41,\n\tInsufficientOutputBuffer = 42,\n\tAuthAccountLocked = 1001,\n\tAuthAccountLockedForUpdate = 1002,\n\tAuthInvalidRefreshToken = 1003,\n\tAuthInvalidToken = 1004,\n\tAuthAuthenticationFailure = 1005,\n\tAuthInvalidPlatformToken = 1006,\n\tAuthWrongAccount = 1007,\n\tAuthWrongClient = 1008,\n\tAuthFullAccountRequired = 1009,\n\tAuthHeadlessAccountRequired = 1010,\n\tAuthPasswordResetRequired = 1011,\n\tAuthPasswordCannotBeReused = 1012,\n\tAuthExpired = 1013,\n\tAuthScopeConsentRequired = 1014,\n\tAuthApplicationNotFound = 1015,\n\tAuthScopeNotFound = 1016,\n\tAuthAccountFeatureRestricted = 1017,\n\tAuthAccountPortalLoadError = 1018,\n\tAuthCorrectiveActionRequired = 1019,\n\tAuthPinGrantCode = 1020,\n\tAuthPinGrantExpired = 1021,\n\tAuthPinGrantPending = 1022,\n\tAuthExternalAuthNotLinked = 1030,\n\tAuthExternalAuthRevoked = 1032,\n\tAuthExternalAuthInvalid = 1033,\n\tAuthExternalAuthRestricted = 1034,\n\tAuthExternalAuthCannotLogin = 1035,\n\tAuthExternalAuthExpired = 1036,\n\tAuthExternalAuthIsLastLoginType = 1037,\n\tAuthExchangeCodeNotFound = 1040,\n\tAuthOriginatingExchangeCodeSessionExpired = 1041,\n\tAuthAccountNotActive = 1050,\n\tAuthMFARequired = 1060,\n\tAuthParentalControls = 1070,\n\tAuthNoRealId = 1080,\n\tAuthUserInterfaceRequired = 1090,\n\tFriendsInviteAwaitingAcceptance = 2000,\n\tFriendsNoInvitation = 2001,\n\tFriendsAlreadyFriends = 2003,\n\tFriendsNotFriends = 2004,\n\tFriendsTargetUserTooManyInvites = 2005,\n\tFriendsLocalUserTooManyInvites = 2006,\n\tFriendsTargetUserFriendLimitExceeded = 2007,\n\tFriendsLocalUserFriendLimitExceeded = 2008,\n\tPresenceDataInvalid = 3000,\n\tPresenceDataLengthInvalid = 3001,\n\tPresenceDataKeyInvalid = 3002,\n\tPresenceDataKeyLengthInvalid = 3003,\n\tPresenceDataValueInvalid = 3004,\n\tPresenceDataValueLengthInvalid = 3005,\n\tPresenceRichTextInvalid = 3006,\n\tPresenceRichTextLengthInvalid = 3007,\n\tPresenceStatusInvalid = 3008,\n\tPresenceRichTextNotSupported = 3009,\n\tPresenceTemplateNotSupported = 3010,\n\tPresenceTemplateIdInvalid = 3011,\n\tPresenceTemplateTypeInvalid = 3012,\n\tPresenceTemplateKeyInvalid = 3013,\n\tPresenceTemplateValueInvalid = 3014,\n\tPresenceTemplateNotFound = 3015,\n\tPresenceTemplateInvalidVariableInput = 3016,\n\tPresenceTemplateLocalizationServerError = 3017,\n\tPresenceTemplateUnknownError = 3018,\n\tEcomEntitlementStale = 4000,\n\tEcomCatalogOfferStale = 4001,\n\tEcomCatalogItemStale = 4002,\n\tEcomCatalogOfferPriceInvalid = 4003,\n\tEcomCheckoutLoadError = 4004,\n\tEcomPurchaseProcessing = 4005,\n\tSessionsSessionInProgress = 5000,\n\tSessionsTooManyPlayers = 5001,\n\tSessionsNoPermission = 5002,\n\tSessionsSessionAlreadyExists = 5003,\n\tSessionsInvalidLock = 5004,\n\tSessionsInvalidSession = 5005,\n\tSessionsSandboxNotAllowed = 5006,\n\tSessionsInviteFailed = 5007,\n\tSessionsInviteNotFound = 5008,\n\tSessionsUpsertNotAllowed = 5009,\n\tSessionsAggregationFailed = 5010,\n\tSessionsHostAtCapacity = 5011,\n\tSessionsSandboxAtCapacity = 5012,\n\tSessionsSessionNotAnonymous = 5013,\n\tSessionsOutOfSync = 5014,\n\tSessionsTooManyInvites = 5015,\n\tSessionsPresenceSessionExists = 5016,\n\tSessionsDeploymentAtCapacity = 5017,\n\tSessionsNotAllowed = 5018,\n\tSessionsPlayerSanctioned = 5019,\n\tPlayerDataStorageFilenameInvalid = 6000,\n\tPlayerDataStorageFilenameLengthInvalid = 6001,\n\tPlayerDataStorageFilenameInvalidChars = 6002,\n\tPlayerDataStorageFileSizeTooLarge = 6003,\n\tPlayerDataStorageFileSizeInvalid = 6004,\n\tPlayerDataStorageFileHandleInvalid = 6005,\n\tPlayerDataStorageDataInvalid = 6006,\n\tPlayerDataStorageDataLengthInvalid = 6007,\n\tPlayerDataStorageStartIndexInvalid = 6008,\n\tPlayerDataStorageRequestInProgress = 6009,\n\tPlayerDataStorageUserThrottled = 6010,\n\tPlayerDataStorageEncryptionKeyNotSet = 6011,\n\tPlayerDataStorageUserErrorFromDataCallback = 6012,\n\tPlayerDataStorageFileHeaderHasNewerVersion = 6013,\n\tPlayerDataStorageFileCorrupted = 6014,\n\tConnectExternalTokenValidationFailed = 7000,\n\tConnectUserAlreadyExists = 7001,\n\tConnectAuthExpired = 7002,\n\tConnectInvalidToken = 7003,\n\tConnectUnsupportedTokenType = 7004,\n\tConnectLinkAccountFailed = 7005,\n\tConnectExternalServiceUnavailable = 7006,\n\tConnectExternalServiceConfigurationFailure = 7007,\n\tSocialOverlayLoadError = 8000,\n\tInconsistentVirtualMemoryFunctions = 8001,\n\tLobbyNotOwner = 9000,\n\tLobbyInvalidLock = 9001,\n\tLobbyLobbyAlreadyExists = 9002,\n\tLobbySessionInProgress = 9003,\n\tLobbyTooManyPlayers = 9004,\n\tLobbyNoPermission = 9005,\n\tLobbyInvalidSession = 9006,\n\tLobbySandboxNotAllowed = 9007,\n\tLobbyInviteFailed = 9008,\n\tLobbyInviteNotFound = 9009,\n\tLobbyUpsertNotAllowed = 9010,\n\tLobbyAggregationFailed = 9011,\n\tLobbyHostAtCapacity = 9012,\n\tLobbySandboxAtCapacity = 9013,\n\tLobbyTooManyInvites = 9014,\n\tLobbyDeploymentAtCapacity = 9015,\n\tLobbyNotAllowed = 9016,\n\tLobbyMemberUpdateOnly = 9017,\n\tLobbyPresenceLobbyExists = 9018,\n\tLobbyVoiceNotEnabled = 9019,\n\tLobbyPlatformNotAllowed = 9020,\n\tTitleStorageUserErrorFromDataCallback = 10000,\n\tTitleStorageEncryptionKeyNotSet = 10001,\n\tTitleStorageFileCorrupted = 10002,\n\tTitleStorageFileHeaderHasNewerVersion = 10003,\n\tModsModSdkProcessIsAlreadyRunning = 11000,\n\tModsModSdkCommandIsEmpty = 11001,\n\tModsModSdkProcessCreationFailed = 11002,\n\tModsCriticalError = 11003,\n\tModsToolInternalError = 11004,\n\tModsIPCFailure = 11005,\n\tModsInvalidIPCResponse = 11006,\n\tModsURILaunchFailure = 11007,\n\tModsModIsNotInstalled = 11008,\n\tModsUserDoesNotOwnTheGame = 11009,\n\tModsOfferRequestByIdInvalidResult = 11010,\n\tModsCouldNotFindOffer = 11011,\n\tModsOfferRequestByIdFailure = 11012,\n\tModsPurchaseFailure = 11013,\n\tModsInvalidGameInstallInfo = 11014,\n\tModsCannotGetManifestLocation = 11015,\n\tModsUnsupportedOS = 11016,\n\tAntiCheatClientProtectionNotAvailable = 12000,\n\tAntiCheatInvalidMode = 12001,\n\tAntiCheatClientProductIdMismatch = 12002,\n\tAntiCheatClientSandboxIdMismatch = 12003,\n\tAntiCheatProtectMessageSessionKeyRequired = 12004,\n\tAntiCheatProtectMessageValidationFailed = 12005,\n\tAntiCheatProtectMessageInitializationFailed = 12006,\n\tAntiCheatPeerAlreadyRegistered = 12007,\n\tAntiCheatPeerNotFound = 12008,\n\tAntiCheatPeerNotProtected = 12009,\n\tAntiCheatClientDeploymentIdMismatch = 12010,\n\tAntiCheatDeviceIdAuthIsNotSupported = 12011,\n\tTooManyParticipants = 13000,\n\tRoomAlreadyExists = 13001,\n\tUserKicked = 13002,\n\tUserBanned = 13003,\n\tRoomWasLeft = 13004,\n\tReconnectionTimegateExpired = 13005,\n\tShutdownInvoked = 13006,\n\tUserIsInBlocklist = 13007,\n\tAllocationFailed = 13009,\n\tVoiceModerationModeMismatch = 13010,\n\tEmptyRecord = 13011,\n\tRoomOptionsMismatch = 13012,\n\tProgressionSnapshotSnapshotIdUnavailable = 14000,\n\tParentEmailMissing = 15000,\n\tUserGraduated = 15001,\n\tAndroidJavaVMNotStored = 17000,\n\tReservedMustReferenceLocalVM = 17001,\n\tReservedMustBeNull = 17002,\n\tPermissionRequiredPatchAvailable = 18000,\n\tPermissionRequiredSystemUpdate = 18001,\n\tPermissionAgeRestrictionFailure = 18002,\n\tPermissionAccountTypeFailure = 18003,\n\tPermissionChatRestriction = 18004,\n\tPermissionUGCRestriction = 18005,\n\tPermissionOnlinePlayRestricted = 18006,\n\tDesktopCrossplayApplicationNotBootstrapped = 19000,\n\tDesktopCrossplayServiceNotInstalled = 19001,\n\tDesktopCrossplayServiceStartFailed = 19002,\n\tDesktopCrossplayServiceNotRunning = 19003,\n\tCustomInvitesInviteFailed = 20000,\n\tUserInfoBestDisplayNameIndeterminate = 22000,\n\tOnNetworkRequestedDeprecatedCallbackNotSet = 23000,\n\tCacheStorageSizeKBNotMultipleOf16 = 23001,\n\tCacheStorageSizeKBBelowMinimumSize = 23002,\n\tCacheStorageSizeKBExceedsMaximumSize = 23003,\n\tCacheStorageIndexOutOfRangeRange = 23004,\n\tUnexpectedError = 0x7FFFFFFF\n}\n\nenum ExternalAccountType {\n\tEpic = 0,\n\tSteam = 1,\n\tPsn = 2,\n\tXbl = 3,\n\tDiscord = 4,\n\tGog = 5,\n\tNintendo = 6,\n\tUplay = 7,\n\tOpenid = 8,\n\tApple = 9,\n\tGoogle = 10,\n\tOculus = 11,\n\tItchio = 12,\n\tAmazon = 13,\n\tViveport = 14,\n}\n\nenum ExternalCredentialType {\n\tNone = -1,\n\tEpic = 0,\n\tSteamAppTicket = 1,\n\tPsnIdToken = 2,\n\tXblXstsToken = 3,\n\tDiscordAccessToken = 4,\n\tGogSessionTicket = 5,\n\tNintendoIdToken = 6,\n\tNintendoNsaIdToken = 7,\n\tUplayAccessToken = 8,\n\tOpenidAccessToken = 9,\n\tDeviceidAccessToken = 10,\n\tAppleIdToken = 11,\n\tGoogleIdToken = 12,\n\tOculusUseridNonce = 13,\n\tItchioJwt = 14,\n\tItchioKey = 15,\n\tEpicIdToken = 16,\n\tAmazonAccessToken = 17,\n\tSteamSessionTicket = 18,\n\tViveportUserToken = 19,\n}\n\nenum OnlinePlatformType {\n\tUnknown = 0,\n\tEpic = 100,\n\tPSN = 1000,\n\tNintendo = 2000,\n\tXBL = 3000,\n\tSteam = 4000\n}\n\nenum LoginStatus {\n\tNotLoggedIn = 0,\n\tUsingLocalProfile = 1,\n\tLoggedIn = 2\n}\n\nenum AttributeType {\n\tBoolean = 0,\n\tInt64 = 1,\n\tDouble = 2,\n\tString = 3\n}\n\nenum ComparisonOp {\n\tEqual = 0,\n\tNotEqual = 1,\n\tGreaterThan = 2,\n\tGreaterThanOrEqual = 3,\n\tLessThan = 4,\n\tLessThanOrEqual = 5,\n\tDistance = 6,\n\tAnyOf = 7,\n\tNotAnyOf = 8,\n\tOneOf = 9,\n\tNotOneOf = 10,\n\tContains = 11,\n\tRegexMatch = 12,\n\tSize = 13\n}\n\nenum LogicalCombineOp {\n\tAnd = 0,\n\tOr = 1\n}\n\nenum AntiCheatCommonClientType {\n\tProtectedClient = 0,\n\tUnprotectedClient = 1,\n\tAIBot = 2\n}\n\nenum AntiCheatCommonGameRoundCompetitionType {\n\tNone = 0,\n\tCasual = 1,\n\tRanked = 2,\n\tCompetitive = 3\n}\n\nenum AntiCheatCommonClientPlatform {\n\tUnknown = 0,\n\tWindows = 1,\n\tMac = 2,\n\tLinux = 3,\n\tXbox = 4,\n\tPlayStation = 5,\n\tNintendo = 6,\n\tiOS = 7,\n\tAndroid = 8,\n}\n\nenum AntiCheatCommonClientAction {\n\tInvalid = 0,\n\tRemovePlayer = 1,\n}\n\nenum AntiCheatCommonClientActionReason {\n\tInvalid = 0,\n\tInternalError = 1,\n\tInvalidMessage = 2,\n\tAuthenticationFailed = 3,\n\tNullClient = 4,\n\tHeartbeatTimeout = 5,\n\tClientViolation = 6,\n\tBackendViolation = 7,\n\tTemporaryCooldown = 8,\n\tTemporaryBanned = 9,\n\tPermanentBanned = 10,\n}\n\nenum AntiCheatCommonClientAuthStatus {\n\tInvalid = 0,\n\tLocalAuthComplete = 1,\n\tRemoteAuthComplete = 2,\n}\n\nenum AntiCheatCommonClientFlags {\n\tNone = 0,\n\tAdmin = (1 << 0),\n}\n\nenum AntiCheatCommonClientInput {\n\tUnknown = 0,\n\tMouseKeyboard = 1,\n\tGamepad = 2,\n\tTouchInput = 3,\n}\n\nenum AntiCheatCommonEventType {\n\tInvalid = 0,\n\tGameEvent = 1,\n\tPlayerEvent = 2,\n}\n\nenum AntiCheatCommonEventParamType {\n\tInvalid = 0,\n\tClientHandle = 1,\n\tString = 2,\n\tUInt32 = 3,\n\tInt32 = 4,\n\tUInt64 = 5,\n\tInt64 = 6,\n\tVector3f = 7,\n\tQuat = 8,\n\tFloat = 9,\n}\n\nenum AntiCheatCommonPlayerMovementState {\n\tNone = 0,\n\tCrouching = 1,\n\tProne = 2,\n\tMounted = 3,\n\tSwimming = 4,\n\tFalling = 5,\n\tFlying = 6,\n\tOnLadder = 7,\n}\n\nenum AntiCheatCommonPlayerTakeDamageSource {\n\tNone = 0,\n\tPlayer = 1,\n\tNonPlayerCharacter = 2,\n\tWorld = 3,\n}\n\nenum AntiCheatCommonPlayerTakeDamageType {\n\tNone = 0,\n\tPointDamage = 1,\n\tRadialDamage = 2,\n\tDamageOverTime = 3,\n}\n\nenum AntiCheatCommonPlayerTakeDamageResult {\n\tNone = 0,\n\tDowned_DEPRECATED = 1,\n\tEliminated_DEPRECATED = 2,\n\tNormalToDowned = 3,\n\tNormalToEliminated = 4,\n\tDownedToEliminated = 5\n}\n\nenum AntiCheatClientMode {\n\tInvalid = 0,\n\tClientServer = 1,\n\tPeerToPeer = 2,\n}\n"
  },
  {
    "path": "sample/addons/epic-online-services-godot/eos.gd.uid",
    "content": "uid://idtj8sepvkjw\n"
  },
  {
    "path": "sample/addons/epic-online-services-godot/eosg.gdextension",
    "content": "[configuration]\n\nentry_symbol = \"eosg_library_init\"\ncompatibility_minimum = 4.1\n\n[libraries]\nlinux.debug.x86_64 = \"bin/linux/libeosg.linux.template_debug.dev.x86_64.so\"\nlinux.release.x86_64 = \"bin/linux/libeosg.linux.template_release.x86_64.so\"\nlinux.debug.arm64 = \"bin/linux/libeosg.linux.template_debug.dev.arm64.so\"\nlinux.release.arm64 = \"bin/linux/libeosg.linux.template_release.arm64.so\"\nwindows.debug.x86_64 = \"bin/windows/libeosg.windows.template_debug.dev.x86_64.dll\"\nwindows.release.x86_64 = \"bin/windows/libeosg.windows.template_release.x86_64.dll\"\nmacos.debug = \"bin/macos/libeosg.macos.template_debug.framework\"\nmacos.release = \"bin/macos/libeosg.macos.template_release.framework\"\nios.debug = \"bin/ios/libeosg.ios.template_debug.xcframework\"\nios.release = \"bin/ios/libeosg.ios.template_release.xcframework\"\nandroid.debug.arm64 = \"bin/android/libeosg.android.template_debug.dev.arm64.so\"\nandroid.release.arm64 = \"bin/android/libeosg.android.template_release.arm64.so\"\nandroid.debug.x86_64 = \"bin/android/libeosg.android.template_debug.dev.x86_64.so\"\nandroid.release.x86_64 = \"bin/android/libeosg.android.template_release.x86_64.so\"\n\n[dependencies]\nlinux.debug.x86_64 = {\"bin/linux/libEOSSDK-Linux-Shipping.so\": \"\"}\nlinux.release.x86_64 = {\"bin/linux/libEOSSDK-Linux-Shipping.so\": \"\"}\nlinux.debug.arm64 = {\"bin/linux/libEOSSDK-LinuxArm64-Shipping.so\": \"\"}\nlinux.release.arm64 = {\"bin/linux/libEOSSDK-LinuxArm64-Shipping.so\": \"\"}\nwindows.debug.x86_64 = {\"bin/windows/EOSSDK-Win64-Shipping.dll\": \"\", \"bin/windows/x64/xaudio2_9redist.dll\": \"\"}\nwindows.release.x86_64 = {\"bin/windows/EOSSDK-Win64-Shipping.dll\": \"\", \"bin/windows/x64/xaudio2_9redist.dll\": \"\"}\nmacos.debug = {\"bin/macos/libeosg.macos.template_debug.framework/libEOSSDK-Mac-Shipping.dylib\": \"\"}\nmacos.release = {\"bin/macos/libeosg.macos.template_release.framework/libEOSSDK-Mac-Shipping.dylib\": \"\"}\nios.debug = {\"bin/ios/libgodot-cpp.ios.template_debug.xcframework\": \"\", \"bin/ios/EOSSDK.xcframework\": \"\"}\nios.release = {\"bin/ios/libgodot-cpp.ios.template_release.xcframework\": \"\", \"bin/ios/EOSSDK.xcframework\": \"\"}"
  },
  {
    "path": "sample/addons/epic-online-services-godot/eosg.gdextension.uid",
    "content": "uid://dwyvkkxk32w36\n"
  },
  {
    "path": "sample/addons/epic-online-services-godot/export_plugin.gd",
    "content": "# Copyright (c) 2023-present Delano Lourenco\n# https://github.com/3ddelano/epic-online-services-godot/\n# MIT License\n@tool\nextends EditorExportPlugin\n\nfunc _get_name() -> String:\n\treturn \"Epic Online Services Godot 4.2+ (EOSG)\"\n\nfunc _export_begin(features: PackedStringArray, is_debug: bool, path: String, flags: int):\n\tvar target_platform = features[2]\n\n\tmatch target_platform:\n\t\t\"windows\":\n\t\t\tadd_shared_object(\"res://addons/epic-online-services-godot/bin/windows/EOSSDK-Win64-Shipping.dll\", [], \"/\")\n\t\t\tadd_shared_object(\"res://addons/epic-online-services-godot/bin/windows/x64/xaudio2_9redist.dll\", [], \"/\")\n\n\t\t\"linux\":\n\t\t\tadd_shared_object(\"res://addons/epic-online-services-godot/bin/linux/libEOSSDK-Linux-Shipping.so\", [], \"/\")\n\n\t\t\"macos\":\n\t\t\tadd_shared_object(\"res://addons/epic-online-services-godot/bin/macos/libEOSSDK-Mac-Shipping.dylib\", [], \"/\")\n"
  },
  {
    "path": "sample/addons/epic-online-services-godot/export_plugin.gd.uid",
    "content": "uid://bydaf5hf76858\n"
  },
  {
    "path": "sample/addons/epic-online-services-godot/heos/hachievement_data.gd",
    "content": "## Achievement data from Epic Online Services\nclass_name HAchievementData\nextends BaseClass\n\n\nfunc _init() -> void:\n\tsuper._init(\"HAchievementData\")\n\n## Achievement ID that can be used to uniquely identify the achievement.\nvar achievement_id: String\n\n## Localized display name for the achievement when it has been unlocked.\nvar unlocked_display_name: String\n\n## Localized description for the achievement when it has been unlocked.\nvar unlocked_description: String\n\n## URL of an icon to display for the achievement when it is unlocked. This may be null if there is no data configured in the dev portal.\nvar unlocked_icon_url: String\n\n## Localized display name for the achievement when it is locked or hidden.\nvar locked_display_name: String\n\n## Localized description for the achievement when it is locked or hidden.\nvar locked_description: String\n\n## URL of an icon to display for the achievement when it is locked or hidden. This may be null if there is no data configured in the dev portal.\nvar locked_icon_url: String\n\n## Localized flavor text that can be used by the game in an arbitrary manner. This may be null if there is no data configured in the dev portal.\nvar flavor_text: String\n\n## Whether the achievement is hidden or not\nvar is_hidden: bool\n\n## Progress towards completing this achievement (as a percentage).\nvar progress := 0.0\n\n## Either [EOS.Achievements.UNLOCK_TIME_UNDEFINED] if not unlocked or the unix timestamp of when the achievement was unlocked by the user\nvar unlock_time := EOS.Achievements.UNLOCK_TIME_UNDEFINED\n\n## Array of [Dictionary] having keys: name:String, current_value:int, threshold_value:int.\nvar stats = []\n\n\n## Whether this achievement is unlocked\nfunc is_unlocked() -> bool:\n\treturn unlock_time != EOS.Achievements.UNLOCK_TIME_UNDEFINED\n\n\n## Get the appropriate display name based on whether the achievement is unlocked or not\nfunc get_display_name() -> String:\n\tif is_unlocked():\n\t\treturn unlocked_display_name\n\treturn locked_display_name\n\n\n## Get the appropriate description based on whether the achievement is unlocked or not\nfunc get_description() -> String:\n\tif is_unlocked():\n\t\treturn unlocked_description\n\treturn locked_description\n\n\n## Get the appropriate icon URL based on whether the achievement is unlocked or not\nfunc get_icon_url() -> String:\n\tif is_unlocked():\n\t\treturn unlocked_icon_url\n\treturn locked_icon_url\n\n\nfunc update_stat(p_stat: Dictionary) -> void:\n\tvar found = false\n\tfor i in stats.size():\n\t\tvar stat = stats[i]\n\t\tif stat.name == p_stat.name:\n\t\t\tstats[i] = p_stat\n\t\t\tfound = true\n\t\t\tbreak\n\t\n\tif not found:\n\t\tstats.append(p_stat) "
  },
  {
    "path": "sample/addons/epic-online-services-godot/heos/hachievement_data.gd.uid",
    "content": "uid://we6ap3yuu378\n"
  },
  {
    "path": "sample/addons/epic-online-services-godot/heos/hachievements.gd",
    "content": "extends Node\n\n#region Signals\n\n## Emitted when an achievement is unlocked\n## data has the following keys: achievement_id:String, unlock_time:int, user_id:String\nsignal achievement_unlocked(data: Dictionary)\n\n#endregion\n\n\n#region Public vars\n\n#endregion\n\n\n#region Private vars \n\nvar _log = HLog.logger(\"HAchievements\")\nvar _achievements: Array[HAchievementData]= [] \n\n#endregion\n\n\n#region Built-in methods\n\nfunc _ready() -> void:\n\tIEOS.achievements_interface_achievements_unlocked_v2_callback.connect(_on_achievements_interface_achievements_unlocked_v2_callback)\n\n#endregion\n\n\n#region Public methods\n\n## Returns an [Array] of [HAchievementData] representing all the achievements in the game\nfunc get_all_achievements_async() -> Array[HAchievementData]:\n\t_log.debug(\"Getting all achievements...\")\n\n\tvar opts = EOS.Achievements.QueryDefinitionsOptions.new()\n\tEOS.Achievements.AchievementsInterface.query_definitions(opts)\n\n\tvar ret = await IEOS.achievements_interface_query_definitions_callback\n\tif not EOS.is_success(ret):\n\t\t_log.error(\"Failed to query achievements: result_code=%s\" % EOS.result_str(ret))\n\t\treturn []\n\t\n\n\tvar get_count_opts = EOS.Achievements.GetAchievementDefinitionCountOptions.new()\n\tvar achievement_count: int = EOS.Achievements.AchievementsInterface.get_achievement_definition_count(get_count_opts)\n\t_log.debug(\"Got all achievements: count=%s\" % achievement_count)\n\t\n\tvar achievements: Array[HAchievementData] = []\n\tfor i in achievement_count:\n\t\tvar copy_opts = EOS.Achievements.CopyAchievementDefinitionV2ByIndexOptions.new()\n\t\tcopy_opts.achievement_index = i\n\n\t\tvar copy_ret = EOS.Achievements.AchievementsInterface.copy_achievement_definition_v2_by_index(copy_opts)\n\t\tif not EOS.is_success(copy_ret):\n\t\t\t_log.error(\"Failed to copy achievement: result_code=%s\" % EOS.result_str(copy_ret))\n\t\t\tcontinue\n\t\tvar definition: Dictionary = copy_ret.definition_v2\n\t\tvar data = HAchievementData.new()\n\t\tvar stat_thresholds = definition.stat_thresholds\n\t\tdefinition.erase(\"stat_thresholds\")\n\t\tdata.from_dict(definition)\n\t\tfor threshold_data in stat_thresholds:\n\t\t\tvar stat = {name = threshold_data.name, current_value = 0, threshold_value = threshold_data.threshold}\n\t\t\tdata.update_stat(stat)\n\n\t\tachievements.append(data)\n\n\t_achievements = achievements\n\treturn achievements\n\n\n## Returns an [Array] of [HAchievementData] representing all the player's achievements\nfunc get_player_achievements_async() -> Array[HAchievementData]:\n\t_log.debug(\"Getting player achievements...\")\n\tvar opts = EOS.Achievements.QueryPlayerAchievementsOptions.new()\n\n\tEOS.Achievements.AchievementsInterface.query_player_achievements(opts)\n\tvar ret = await IEOS.achievements_interface_query_player_achievements_callback\n\n\tif not EOS.is_success(ret):\n\t\t_log.error(\"Failed to query player achievements: result_code=%s\" % EOS.result_str(ret))\n\t\treturn []\n\t\n\tvar get_count_opts = EOS.Achievements.GetPlayerAchievementCountOptions.new()\n\tget_count_opts.user_id = HAuth.product_user_id\n\tvar achievements_count = EOS.Achievements.AchievementsInterface.get_player_achievement_count(get_count_opts)\n\t_log.debug(\"Got player achievements: count=%s\" % achievements_count)\n\n\tvar achievements: Array[HAchievementData] = []\n\tfor i in achievements_count:\n\t\tvar copy_opts = EOS.Achievements.CopyPlayerAchievementByIndexOptions.new()\n\t\tcopy_opts.achievement_index = i\n\t\tcopy_opts.target_user_id = HAuth.product_user_id\n\n\t\tvar copy_ret = EOS.Achievements.AchievementsInterface.copy_player_achievement_by_index(copy_opts)\n\t\tif not EOS.is_success(copy_ret):\n\t\t\t_log.error(\"Failed to copy player achievement: result_code=%s\" % EOS.result_str(copy_ret))\n\t\t\tcontinue\n\t\t\n\t\tvar achievement_data = copy_ret.player_achievement\n\n\t\tvar cached_achievement = null\n\t\tfor achievement in _achievements:\n\t\t\tif achievement.achievement_id == achievement_data.achievement_id:\n\t\t\t\tcached_achievement = achievement\n\t\tvar data: HAchievementData = HAchievementData.new() if cached_achievement == null else cached_achievement\n\t\t\n\t\tdata.progress = achievement_data.progress\n\t\tdata.unlock_time = achievement_data.unlock_time\n\t\tfor stat in achievement_data.stat_infos:\n\t\t\tdata.update_stat(stat)\n\t\t\n\t\tif cached_achievement == null:\n\t\t\tdata.achievement_id = achievement_data.achievement_id\n\t\t\tdata.flavor_text = achievement_data.flavor_text\n\t\t\tif data.is_unlocked():\n\t\t\t\tdata.unlocked_display_name = achievement_data.display_name\n\t\t\t\tdata.unlocked_description = achievement_data.description\n\t\t\t\tdata.unlocked_icon_url = achievement_data.icon_url\n\t\t\telse:\n\t\t\t\tdata.locked_display_name = achievement_data.display_name\n\t\t\t\tdata.locked_description = achievement_data.description\n\t\t\t\tdata.locked_icon_url = achievement_data.icon_url\n\t\t\t\n\t\tachievements.append(data)\n\n\treturn achievements\n\t\n\nfunc unlock_achievement_async(achievement_id: String) -> bool:\n\t_log.debug(\"Unlocking single achievement: achievement_id=%s\" % achievement_id)\n\treturn await unlock_achievements_async([achievement_id])\n\n\nfunc unlock_achievements_async(achievement_ids: Array) -> bool:\n\t_log.debug(\"Unlocking multiple achievement(s): achievement_ids=%s\" % str(achievement_ids))\n\t\n\tvar opts = EOS.Achievements.UnlockAchievementsOptions.new()\n\topts.user_id = HAuth.product_user_id\n\topts.achievement_ids = achievement_ids\n\n\tEOS.Achievements.AchievementsInterface.unlock_achievements(opts)\n\n\tvar res: Dictionary = await IEOS.achievements_interface_unlock_achievements_callback\n\n\tif not EOS.is_success(res):\n\t\t_log.error(\"Failed to unlock achievement(s): result_code=%s\" % EOS.result_str(res))\n\t\treturn false\n\n\t_log.debug(\"Unlocked %s achievement(s)\" % res.achievements_count)\n\n\treturn true\n\n#endregion\n\n\n#region Private methods\n\nfunc _on_achievements_interface_achievements_unlocked_v2_callback(data: Dictionary):\n\t_log.verbose(\"Got Achievement unlocked v2 callback\")\n\tachievement_unlocked.emit(data)\n\n#endregion\n"
  },
  {
    "path": "sample/addons/epic-online-services-godot/heos/hachievements.gd.uid",
    "content": "uid://bis404dty5u5c\n"
  },
  {
    "path": "sample/addons/epic-online-services-godot/heos/hauth.gd",
    "content": "# Good article about the EOS login flows: https://eoshelp.epicgames.com/s/article/What-is-the-correct-login-flow-for-a-game-that-supports-crossplay\nextends Node\n\n#region Signals\n\n## Emitted when the user logs in to Epic Game Services. If the [auto_connect_account] option is false, this will also be emitted when the user logs in to Epic Account Services\nsignal logged_in\n\n## Emitted when the user logs out of Epic Game Services\nsignal logged_out\n\n## Emitted when an error occurs while loggin in\nsignal login_error(result_code: EOS.Result)\n\n## Related to Epic Account Services\nsignal logged_in_auth\n\n## Related to Epic Account Services\nsignal logged_out_auth\n\n## Related to Epic Account Services\nsignal login_auth_error(result_code: EOS.Result)\n\n## Related to Epic Game Services\nsignal logged_in_connect\n\n## Related to Epic Game Services\nsignal logged_out_connect\n\n## Related to Epic Game Services\nsignal login_connect_error(result_code: EOS.Result)\n\n## Emitted when the display name is changed. Get the display name using HAuth.display_name.\n## When user logs in, this event will be emitted when we receive the user's display name.\n## When user logs out, this event will be emitted as display name will be empty string.\nsignal display_name_changed\n\n## Emitted when the external account info is changed.\n## When user logs in, this event will be emitted when we receive the user's external account info.\n## When user logs out, this event will be emitted as external account info will be empty.\nsignal external_account_info_changed\n\n#endregion\n\n\n#region Public vars\n\n## The epic account id of the logged in user (Used for Epic Account Services)\nvar epic_account_id := \"\"\n\n## The product user id of the logged in user (Used for Epic Game Services)\nvar product_user_id := \"\"\n\n## The display name of the logged in user\nvar display_name: String\n\n\n## Whether to automatically fetch the external account linked with Epic Game Services (default true)\nvar auto_fetch_external_account := true\n\n## The external account linked with Epic Game Services\n## See [method get_external_account_by_type_async] for return type\nvar external_account_info := {}\n\n\n## Whether to automatically link an epic account for external identity provider (default true)\nvar auto_link_account := true\n\n## Whether to automatically login to Epic Game Services after logging in to Epic Account Services (default true)\nvar auto_connect_account := true\n\n## Default scope flags used when logging in with Epic Account Services[br]\n## Flags from [enum EOS.Auth.ScopeFlags]\nvar auth_login_scope_flags: int = EOS.Auth.ScopeFlags.BasicProfile | EOS.Auth.ScopeFlags.Presence | EOS.Auth.ScopeFlags.FriendsList\n\n## Default login flags used when logging in with Epic Account Services.[br]\n## Flags from [enum EOS.Auth.LoginFlags]\nvar auth_login_flags: int = EOS.Auth.LoginFlags.None\n\n#endregion\n\n\n#region Private vars \n\nvar _log = HLog.logger(\"HAuth\")\nvar _last_connect_login_opts: EOS.Connect.LoginOptions\n#endregion\n\n\n#region Built-in methods\n\nfunc _ready() -> void:\n\tIEOS.connect_interface_auth_expiration.connect(_on_connect_interface_auth_expiration)\n\n#endregion\n\n\n#region Public methods\n\n\n## Login using the Epic Dev Auth tool\nfunc login_devtool_async(server_url: String, credential_name: String) -> bool:\n\t_log.debug(\"Logging in using Epic Dev Auth tool...\")\n\tvar opts = EOS.Auth.LoginOptions.new()\n\topts.credentials = EOS.Auth.Credentials.new()\n\topts.credentials.type = EOS.Auth.LoginCredentialType.Developer\n\topts.credentials.id = server_url\n\topts.credentials.token = credential_name\n\topts.scope_flags = auth_login_scope_flags\n\topts.login_flags = auth_login_flags\n\n\treturn await login_async(opts)\n\n\n## Login using Epic Account Portal\nfunc login_account_portal_async() -> bool:\n\t_log.debug(\"Logging in using Epic Account Portal...\")\n\tvar opts = EOS.Auth.LoginOptions.new()\n\topts.credentials = EOS.Auth.Credentials.new()\n\topts.credentials.type = EOS.Auth.LoginCredentialType.AccountPortal\n\topts.scope_flags = auth_login_scope_flags\n\topts.login_flags = auth_login_flags\n\n\treturn await login_async(opts)\n\n\n## Login using credentials provided by the Epic Games Launcher[br]\n## To test this locally provide the cli argument -AUTH_PASSWORD=<exchange_code> when running your game like [code]godot4 . -AUTH_PASSWORD=1234[/code][br]\n## You can generate an exchange code by using the DevAuthTool and accessing the following link on a browser: [code]http://localhost:<PORT>/<credential_name>/exchange_code[/code]\nfunc login_launcher_async() -> bool:\n\t_log.debug(\"Logging in using Epic Games Launcher...\")\n\tvar cli_opts = _get_command_line_options()\n\tvar auth_password = cli_opts.get(\"AUTH_PASSWORD\", \"\")\n\n\tif \"\" == auth_password:\n\t\t_log.error(\"Missing -AUTH_PASSWORD=<exchange_code> cli argument. Please see usage docs.\")\n\t\treturn false\n\n\tvar opts = EOS.Auth.LoginOptions.new()\n\topts.credentials = EOS.Auth.Credentials.new()\n\topts.credentials.type = EOS.Auth.LoginCredentialType.ExchangeCode\n\topts.credentials.token = auth_password\n\topts.scope_flags = auth_login_scope_flags\n\topts.login_flags = auth_login_flags\n\n\treturn await login_async(opts)\n\n\n## Login using EOS Auth by either using an Identity provider or Epic games Account.\n## Allows you to use Epic Account Services: Friends, Presence, Social Overlay, ECom, etc.\n## This is the recommended way of logging in as you get many additional features compared to [login_game_services_async]\nfunc login_async(opts: EOS.Auth.LoginOptions) -> bool:\n\t_log.debug(\"Logging into Epic Account Services (AuthInterface)...\")\n\tEOS.Auth.AuthInterface.login(opts)\n\n\tvar auth_login_ret: Dictionary = await IEOS.auth_interface_login_callback\n\tvar auth_res: EOS.Result = auth_login_ret.result_code\n\t\n\tif auth_res == EOS.Result.AuthMFARequired:\n\t\t_log.error(\"Auth requires MFA - This is not supported by the EOS SDK. Please use an account without MFA or use an alternative login method\")\n\t\t_emit_login_auth_error(auth_res)\n\t\treturn false\n\t\n\tif auth_res == EOS.Result.InvalidUser:\n\t\tif not auth_login_ret.continuance_token:\n\t\t\t_log.error(\"Auth login failed - Continuance token is invalid\")\n\t\t\t_emit_login_auth_error(EOS.Result.InvalidState)\n\t\t\treturn false\n\t\t\n\t\tif not auto_link_account:\n\t\t\t_log.error(\"Auth login failed - External account not connected\")\n\t\t\t_emit_login_auth_error(EOS.Result.InvalidUser)\n\t\t\treturn false\n\t\t\n\t\t_log.debug(\"External account not found. Proceeding to connect account...\")\n\t\tvar continue_success = await _continue_login_async(auth_login_ret.continuance_token)\n\t\tif not continue_success:\n\t\t\treturn false\n\t\n\telif not EOS.is_success(auth_res):\n\t\t_log.error(\"Failed to login with EOS Auth: result_code=%s\" % EOS.result_str(auth_res))\n\t\t_emit_login_auth_error(auth_res)\n\t\treturn false\n\t\n\tif auth_login_ret.selected_account_id:\n\t\tepic_account_id = auth_login_ret.selected_account_id\n\t\n\tif epic_account_id:\n\t\t_log.info(\"Logged into Epic Account Services with Epic Account ID: %s\" % epic_account_id)\n\t\n\tif not auto_connect_account:\n\t\tlogged_in_auth.emit()\n\t\tlogged_in.emit()\n\t\treturn true\n\n\treturn await _connect_account_async()\n\n\n## Logout from EOS Auth and or EOS Connect\nfunc logout_async() -> EOS.Result:\n\t_log.verbose(\"Logging out from EOS...\")\n\tvar ret := EOS.Result.InvalidAuth\n\tvar _logged_out = false\n\n\tif product_user_id:\n\t\t_log.debug(\"Logging out from EOS Connect\")\n\t\tvar logout_connect_opts = EOS.Connect.LogoutOptions.new()\n\t\tEOS.Connect.ConnectInterface.logout(logout_connect_opts)\n\t\tvar logout_connect_ret = await IEOS.connect_interface_logout_callback\n\t\tret = logout_connect_ret.result_code\n\n\t\tif not EOS.is_success(ret):\n\t\t\t_log.error(\"Failed to logout of EOS Connect. result_code=%s\" % EOS.result_str(ret))\n\t\t\treturn ret\n\t\telse:\n\t\t\t_log.debug(\"Logged out from EOS connect: product_user_id=%s\" % product_user_id)\n\t\t\tproduct_user_id = \"\"\n\t\t\t_logged_out = true\n\t\t\tlogged_out_connect.emit()\n\n\n\tif epic_account_id:\n\t\t_log.debug(\"Logging out from EOS Auth\")\n\t\tvar logout_auth_opts = EOS.Auth.LogoutOptions.new()\n\t\tEOS.Auth.AuthInterface.logout(logout_auth_opts)\n\t\tvar logout_auth_ret = await IEOS.auth_interface_logout_callback\n\t\tret = logout_auth_ret.result_code\n\t\n\t\tif not EOS.is_success(ret):\n\t\t\t_log.error(\"Failed to logout of EOS Auth. result_code=%s\" % EOS.result_str(ret))\n\t\telse:\n\t\t\t_log.debug(\"Logged out from EOS Auth: epic_account_id=%s\" % epic_account_id)\n\t\t\tepic_account_id = \"\"\n\t\t\t_logged_out = true\n\t\t\tlogged_out_auth.emit()\n\n\n\tif _logged_out:\n\t\tdisplay_name = \"\"\n\t\texternal_account_info = {}\n\t\tdisplay_name_changed.emit()\n\t\texternal_account_info_changed.emit()\n\t\tlogged_out.emit()\n\n\treturn ret\n\t\n\n## Login with EOS Connect by using external credentials\nfunc login_game_services_async(opts: EOS.Connect.LoginOptions) -> bool:\n\t_log.debug(\"Logging into Epic Game Services (ConnectInterface)...\")\n\t_last_connect_login_opts = opts\n\tEOS.Connect.ConnectInterface.login(opts)\n\n\tvar login_ret: Dictionary = await IEOS.connect_interface_login_callback\n\tvar login_res: EOS.Result = login_ret.result_code\n\t\n\tif login_res == EOS.Result.InvalidUser:\n\t\t_log.debug(\"Epic Game Services user not found. Proceeding to create user...\")\n\t\tvar create_success := await _create_user_async(login_ret.continuance_token)\n\t\tif not create_success:\n\t\t\treturn false\n\t\n\telif not EOS.is_success(login_ret):\n\t\t_log.error(\"Failed to login to Epic Game Services: result_code=%s\" % EOS.result_str(login_res))\n\t\t_emit_login_connect_error(login_res)\n\t\treturn false\n\n\tif login_ret.local_user_id:\n\t\tproduct_user_id = login_ret.local_user_id\n\t\n\tif product_user_id:\n\t\t_log.info(\"Logged into Epic Games Services with Product User ID: %s\" % product_user_id)\n\t\tif auto_fetch_external_account and EOS.ExternalCredentialType.DeviceidAccessToken != opts.credentials.type:\n\t\t\tget_product_user_info_async()\n\n\tlogged_in_connect.emit()\n\tlogged_in.emit()\n\treturn true\n\n\n## Login automatically if an Epic refresh token is stored by a previous login with Epic Account Portal\nfunc login_persistent_auth_async() -> bool:\n\t_log.debug(\"Logging in with persistent auth...\")\n\tvar opts = EOS.Auth.LoginOptions.new()\n\topts.credentials = EOS.Auth.Credentials.new()\n\topts.credentials.type = EOS.Auth.LoginCredentialType.PersistentAuth\n\topts.scope_flags = auth_login_scope_flags\n\topts.login_flags = auth_login_flags\n\n\treturn await login_async(opts)\n\n\n## Delete the internally stored Epic refresh token\nfunc delete_persistent_auth_async(refresh_token := \"\") -> bool:\n\t_log.debug(\"Deleting persistent auth...\")\n\tvar opts = EOS.Auth.DeletePersistentAuthOptions.new()\n\topts.refresh_token = refresh_token\n\tEOS.Auth.AuthInterface.delete_persistent_auth(opts)\n\n\tvar ret = await IEOS.auth_interface_delete_persistent_auth_callback\n\tif not EOS.is_success(ret):\n\t\t_log.error(\"Failed to delete persistent auth: result_code=%s\" % EOS.result_str(ret))\n\t\treturn false\n\t\n\treturn true\n\n\n## Login to Epic Game Services without any credentials.\n## You must provide a user display name.\nfunc login_anonymous_async(p_user_display_name: String) -> bool:\n\tvar user_display_name := p_user_display_name.strip_edges()\n\tif not p_user_display_name:\n\t\t_log.error(\"User display name is empty\")\n\t\treturn false\n\t_log.debug(\"Logging in anonymously...\")\n\n\tEOS.Connect.ConnectInterface.delete_device_id(EOS.Connect.DeleteDeviceIdOptions.new())\n\tvar delete_ret = await IEOS.connect_interface_delete_device_id_callback\n\tif not EOS.is_success(delete_ret):\n\t\t_log.debug(\"Failed to delete device id: result_code=%s\" % EOS.result_str(delete_ret))\n\t\n\tvar opts = EOS.Connect.CreateDeviceIdOptions.new()\n\topts.device_model = \" \".join(PackedStringArray([OS.get_name(), OS.get_model_name()]))\n\tEOS.Connect.ConnectInterface.create_device_id(opts)\n\n\tvar create_ret = await IEOS.connect_interface_create_device_id_callback\n\tif not EOS.is_success(create_ret):\n\t\t_log.error(\"Failed to create device id: result_code=%s\" % EOS.result_str(create_ret))\n\t\treturn false\n\t\n\tvar login_opts = EOS.Connect.LoginOptions.new()\n\tlogin_opts.credentials = EOS.Connect.Credentials.new()\n\tlogin_opts.credentials.type = EOS.ExternalCredentialType.DeviceidAccessToken\n\tlogin_opts.credentials.token = null\n\tlogin_opts.user_login_info = EOS.Connect.UserLoginInfo.new()\n\tlogin_opts.user_login_info.display_name = user_display_name\n\tdisplay_name = user_display_name\n\tdisplay_name_changed.emit()\n\t\n\treturn await login_game_services_async(login_opts)\n\n\n## Get the user info from epic account id.[br]\n## Returns a [Dictionary] with the following keys or empty dictionary if error occurred:[codeblock]\n## user_id: String\n## country: String\n## display_name: String\n## display_name_sanitized: String\n## preferred_language: String\n## nickname: String\n## [/codeblock]\nfunc get_user_info_async(p_epic_account_id := epic_account_id) -> Dictionary:\n\t_log.verbose(\"Querying user info: epic_account_id=%s\" % p_epic_account_id)\n\tvar query_opts = EOS.UserInfo.QueryUserInfoOptions.new()\n\tquery_opts.local_user_id = epic_account_id\n\tquery_opts.target_user_id = p_epic_account_id\n\tEOS.UserInfo.UserInfoInterface.query_user_info(query_opts)\n\n\tvar ret: Dictionary = await IEOS.user_info_interface_query_user_info_callback\n\tif not EOS.is_success(ret):\n\t\t_log.error(\"Failed to query user info: result_code=%s\" % EOS.result_str(ret))\n\t\treturn {}\n\t\n\tvar copy_opts = EOS.UserInfo.CopyUserInfoOptions.new()\n\tcopy_opts.local_user_id = epic_account_id\n\tcopy_opts.target_user_id = p_epic_account_id\n\tvar copy_ret = EOS.UserInfo.UserInfoInterface.copy_user_info(copy_opts)\n\tif not EOS.is_success(copy_ret):\n\t\t_log.error(\"Failed to copy user info: result_code=%s\" % EOS.result_str(copy_ret))\n\t\treturn {}\n\n\treturn copy_ret.user_info\n\n\n## Get the external user account linked with Epic Game Services[br]\n## Returns a [Dictionary] with the following keys or empty dictionary if error occurred:\n## [codeblock]\n## product_user_id: String - the product user ID of the external account\n## display_name: String - external account display name or empty string\n## account_id: String - external account id\n## account_id_type: EOS.ExternalAccountType - type of external account\n## last_login_time: int - unix timestamp when the user last logged in or -1\n## [/codeblock]\nfunc get_external_account_by_type_async(p_external_account_type: EOS.ExternalAccountType, p_product_user_id := product_user_id) -> Dictionary:\n\t_log.debug(\"Getting external account by type: external_account_type=%s product_user_id=%s\" % [p_external_account_type, p_product_user_id])\n\n\tvar opts = EOS.Connect.QueryProductUserIdMappingsOptions.new()\n\topts.product_user_ids = [p_product_user_id]\n\tEOS.Connect.ConnectInterface.query_product_user_id_mappings(opts)\n\tvar ret = await IEOS.connect_interface_query_product_user_id_mappings_callback\n\tif not EOS.is_success(ret):\n\t\t_log.error(\"Failed to query product user id mappings: result_code=%s\" % EOS.result_str(ret))\n\t\treturn {}\n\n\tvar copy_opts = EOS.Connect.CopyProductUserExternalAccountByAccountTypeOptions.new()\n\tcopy_opts.account_id_type = p_external_account_type\n\tcopy_opts.target_user_id = p_product_user_id\n\tvar copy_ret = EOS.Connect.ConnectInterface.copy_product_user_external_account_by_account_type(copy_opts)\n\tif not EOS.is_success(copy_ret):\n\t\t_log.error(\"Failed to copy external account: result_code=%s\" % EOS.result_str(copy_ret))\n\t\treturn {}\n\t\n\t_log.debug(\"Got external account info: product_user_id=%s\" % p_product_user_id)\n\t\n\tvar acc_info = copy_ret.external_account_info\n\tif not acc_info:\n\t\tacc_info = {}\n\t\t_log.error(\"Failed to get external account info\")\n\t\n\treturn acc_info\n\n\n## Get all external accounts linked with Epic Games Services[br]\n## Returns a [Dictionary] with same keys as [method get_external_account_by_type_async][br]\nfunc get_external_accounts_async(p_product_user_id := product_user_id) -> Array:\n\t_log.debug(\"Getting all external accounts: product_user_id=%s\" % p_product_user_id)\n\n\tvar opts = EOS.Connect.QueryProductUserIdMappingsOptions.new()\n\topts.product_user_ids = [p_product_user_id]\n\tEOS.Connect.ConnectInterface.query_product_user_id_mappings(opts)\n\tvar ret = await IEOS.connect_interface_query_product_user_id_mappings_callback\n\tif not EOS.is_success(ret):\n\t\t_log.error(\"Failed to query product user id mappings: result_code=%s\" % EOS.result_str(ret))\n\t\treturn []\n\n\n\tvar count_opts = EOS.Connect.GetProductUserExternalAccountCountOptions.new()\n\tcount_opts.target_user_id = p_product_user_id\n\tvar count = EOS.Connect.ConnectInterface.get_product_user_external_account_count(count_opts)\n\n\tvar ext_accs = []\n\tfor i in range(count):\n\t\tvar copy_opts = EOS.Connect.CopyProductUserExternalAccountByIndexOptions.new()\n\t\tcopy_opts.target_user_id = p_product_user_id\n\t\tcopy_opts.external_account_info_index = i\n\n\t\tvar copy_ret = EOS.Connect.ConnectInterface.copy_product_user_external_account_by_index(copy_opts)\n\t\tif not EOS.is_success(copy_ret):\n\t\t\t_log.error(\"Failed to copy external account: result_code=%s, index=%s\" % [EOS.result_str(copy_ret), i])\n\t\t\tcontinue\n\t\tif copy_ret.external_account_info:\n\t\t\text_accs.append(copy_ret.external_account_info)\n\n\treturn ext_accs\n\n\n## Get the external account linked with Epic Game Services that the user most recently logged in with.[br]\n## Returns a [Dictionary] with same keys as [method get_external_account_by_type_async]\nfunc get_product_user_info_async(p_product_user_id := product_user_id):\n\t_log.debug(\"Getting product user info: product_user_id=%s\" % p_product_user_id)\n\n\tvar opts = EOS.Connect.QueryProductUserIdMappingsOptions.new()\n\topts.product_user_ids = [p_product_user_id]\n\tEOS.Connect.ConnectInterface.query_product_user_id_mappings(opts)\n\tvar ret = await IEOS.connect_interface_query_product_user_id_mappings_callback\n\tif not EOS.is_success(ret):\n\t\t_log.error(\"Failed to query product user id mappings: result_code=%s\" % EOS.result_str(ret))\n\t\treturn {}\n\n\tvar copy_opts = EOS.Connect.CopyProductUserInfoOptions.new()\n\tcopy_opts.target_user_id = p_product_user_id\n\tvar copy_ret = EOS.Connect.ConnectInterface.copy_product_user_info(copy_opts)\n\tif not EOS.is_success(copy_ret):\n\t\t_log.error(\"Failed to copy product user info: result_code=%s\" % EOS.result_str(copy_ret))\n\t\treturn {}\n\t\n\t_log.debug(\"Got product user info: product_user_id=%s\" % p_product_user_id)\n\n\tvar ext_acc = copy_ret.external_account_info\n\tif not ext_acc:\n\t\t_log.error(\"Failed to get external account info\")\n\tif ext_acc and ext_acc.product_user_id == product_user_id:\n\t\texternal_account_info = ext_acc\n\t\texternal_account_info_changed.emit()\n\n\t\tif ext_acc.display_name:\n\t\t\tdisplay_name = ext_acc.display_name\n\t\t\tdisplay_name_changed.emit()\n\n\treturn ext_acc\n\n#endregion\n\n\n#region Private methods\n\nfunc _on_connect_interface_auth_expiration(data: Dictionary):\n\t_log.debug(\"Connect Auth Expiring...\")\n\t_connect_account_async()\n\n\nfunc _connect_account_async() -> bool:\n\t_log.debug(\"Connecting account to Epic Game Services...\")\n\t\n\tif _last_connect_login_opts:\n\t\tvar opts = _last_connect_login_opts\n\t\tif opts and opts.credentials and EOS.ExternalCredentialType.DeviceidAccessToken == opts.credentials.type:\n\t\t\treturn await login_game_services_async(opts)\n\n\t# Copy the user auth token\n\tvar auth_token_ret = EOS.Auth.AuthInterface.copy_user_auth_token(EOS.Auth.CopyUserAuthTokenOptions.new(), epic_account_id)\n\tif not EOS.is_success(auth_token_ret):\n\t\t_log.error(\"Failed to get user auth token: result_code=%s\" % EOS.result_str(auth_token_ret))\n\t\t_emit_login_auth_error(auth_token_ret.result_code)\n\t\treturn false\n\n\tvar token = auth_token_ret.token\n\n\tvar login_options = EOS.Connect.LoginOptions.new()\n\tlogin_options.credentials = EOS.Connect.Credentials.new()\n\tlogin_options.credentials.type = EOS.ExternalCredentialType.Epic\n\tlogin_options.credentials.token = token.access_token\n\n\t# Emit signal only if we are not refreshing the login\n\tif not epic_account_id:\n\t\tlogged_in_auth.emit()\n\n\treturn await login_game_services_async(login_options)\n\n\nfunc _continue_login_async(continuance_token: EOSGContinuanceToken) -> bool:\n\t_log.debug(\"Continuing login...\")\n\tvar link_opts = EOS.Auth.LinkAccountOptions.new()\n\tlink_opts.continuance_token = continuance_token\n\tEOS.Auth.AuthInterface.link_account(link_opts)\n\n\tvar link_ret: Dictionary = await IEOS.auth_interface_link_account_callback\n\tif not EOS.is_success(link_ret):\n\t\t_log.error(\"Failed to link account: result_code=%s\" % EOS.result_str(link_ret))\n\t\t_emit_login_auth_error(link_ret.result_code)\n\t\treturn false\n\t\n\tif link_ret.selected_account_id:\n\t\tepic_account_id = link_ret.selected_account_id\n\n\treturn true\n\t\n\nfunc _create_user_async(continuance_token: EOSGContinuanceToken) -> bool:\n\t_log.debug(\"Creating user...\")\n\tvar create_opts = EOS.Connect.CreateUserOptions.new()\n\tcreate_opts.continuance_token = continuance_token\n\tEOS.Connect.ConnectInterface.create_user(create_opts)\n\n\tvar create_ret: Dictionary = await IEOS.connect_interface_create_user_callback\n\n\tif not EOS.is_success(create_ret):\n\t\t_log.error(\"Failed to create user: result_code=%s\" % EOS.result_str(create_ret))\n\t\t_emit_login_connect_error(create_ret.result_code)\n\t\treturn false\n\t\n\tif create_ret.local_user_id:\n\t\tproduct_user_id = create_ret.local_user_id\n\t\n\treturn true\n\n\nfunc _emit_login_auth_error(result_code: EOS.Result):\n\tlogin_auth_error.emit(result_code)\n\tlogin_error.emit(result_code)\n\n\nfunc _emit_login_connect_error(result_code: EOS.Result):\n\tlogin_connect_error.emit(result_code)\n\tlogin_error.emit(result_code)\n\n\nfunc _get_command_line_options():\n\tvar options = {}\n\tvar args = OS.get_cmdline_args()\n\tfor arg in args:\n\t\targ = arg.trim_prefix(\"--\").trim_prefix(\"-\")\n\t\tvar kvp = arg.split(\"=\")\n\t\tif len(kvp) > 1:\n\t\t\toptions[kvp[0]] = kvp[1]\n\treturn options\n\n#endregion\n"
  },
  {
    "path": "sample/addons/epic-online-services-godot/heos/hauth.gd.uid",
    "content": "uid://786t1jiowvvg\n"
  },
  {
    "path": "sample/addons/epic-online-services-godot/heos/hcredentials.gd",
    "content": "## Credentials required by Epic Online Services. Get these values from the [url=https://dev.epicgames.com/portal/en-US/]Dev Portal[/url]\nclass_name HCredentials\nextends BaseClass\n\n\nfunc _init() -> void:\n\tsuper._init(\"HCredentials\")\n\n\n## Game name (max 64 characters)[br]Eg. \"My Awesome Game\"\nvar product_name: String\n\n## Game version[br]Eg. \"1.0\"\nvar product_version: String\n\n## Product ID of the game, provided by Epic Games\nvar product_id: String\n\n## Sandbox ID of the game, provided by Epic Games\nvar sandbox_id: String\n\n## Deployment ID of the game, provided by Epic Games\nvar deployment_id: String\n\n## Client ID to use for the game, provided by Epic Games\nvar client_id: String\n\n## Client Secret to use for the game, provided by Epic Games\nvar client_secret: String\n\n## (Optional) 256-bit Encryption Key for file encryption in hexadecimal format (64 hex characters)\nvar encryption_key: String\n"
  },
  {
    "path": "sample/addons/epic-online-services-godot/heos/hcredentials.gd.uid",
    "content": "uid://dh3dlxnt075r2\n"
  },
  {
    "path": "sample/addons/epic-online-services-godot/heos/hfriends.gd",
    "content": "extends Node\n\n#region Signals\n\n#endregion\n\n\n#region Public vars\n\n#endregion\n\n\n#region Private vars \n\nvar _log = HLog.logger(\"HFriends\")\n\n#endregion\n\n\n#region Built-in methods\n\nfunc _ready() -> void:\n\tpass\n\n#endregion\n\n\n#region Public methods\n\n## Returns an [Array] of user info [Dictionary] representing all the user's friends\n## See [HAuth.get_user_info_async] for the return type of user info\nfunc get_friends_async() -> Array:\n\t_log.debug(\"Getting friends...\")\n\n\tvar query_opts = EOS.Friends.QueryFriendsOptions.new()\n\tEOS.Friends.FriendsInterface.query_friends(query_opts)\n\n\tvar ret = await IEOS.friends_interface_query_friends_callback\n\n\tif not EOS.is_success(ret):\n\t\t_log.error(\"Failed to query friends: result_code=%s\" % EOS.result_str(ret))\n\t\treturn []\n\t\n\tvar get_count_opts = EOS.Friends.GetFriendsCountOptions.new()\n\tvar friends_count: int = EOS.Friends.FriendsInterface.get_friends_count(get_count_opts)\n\n\tvar user_infos = []\n\tfor i in friends_count:\n\t\tvar opts = EOS.Friends.GetFriendAtIndexOptions.new()\n\t\topts.index = i\n\n\t\tvar friend_epic_account_id = EOS.Friends.FriendsInterface.get_friend_at_index(opts)\n\t\tvar user_info = await HAuth.get_user_info_async(friend_epic_account_id)\n\t\tif user_info:\n\t\t\tuser_infos.append(user_info)\n\treturn user_infos\n\n#endregion\n\n\n#region Private methods\n\n\n#endregion\n"
  },
  {
    "path": "sample/addons/epic-online-services-godot/heos/hfriends.gd.uid",
    "content": "uid://uumqbey8ji5t\n"
  },
  {
    "path": "sample/addons/epic-online-services-godot/heos/hleaderboards.gd",
    "content": "extends Node\n\n#region Signals\n\n#endregion\n\n\n#region Public vars\n\n#endregion\n\n\n#region Private vars \n\nvar _log = HLog.logger(\"HLeaderboards\")\n\n#endregion\n\n\n#region Built-in methods\n\nfunc _ready() -> void:\n\tpass\n\n#endregion\n\n\n#region Public methods\n\n## Returns an [Array] of [Dictionary] of all the leaderboards.\n## Each leaderboard has the following data:\n##   leaderboard_id: String - unique id\n##   stat_name: String - name of stat used to rank the leaderboard\n##   aggregation: EOS.Leaderboards.LeaderboardAggregation - aggregation used to sort the leaderboard\n##   start_time: int - unix timestamp for the start time or [EOS.Leaderboard.LEADERBOARD_TIME_UNDEFINED]\n##   end_time: int - unix timestamp for the end time or [EOS.Leaderboard.LEADERBOARD_TIME_UNDEFINED]\nfunc get_leaderboard_definitions_async() -> Array:\n\t_log.debug(\"Getting leaderboards...\")\n\tvar query_opts = EOS.Leaderboards.QueryLeaderboardDefinitionsOptions.new()\n\tEOS.Leaderboards.LeaderboardsInterface.query_leaderboard_definitions(query_opts)\n\n\tvar ret: Dictionary = await IEOS.leaderboards_interface_query_leaderboard_definitions_callback\n\tif not EOS.is_success(ret):\n\t\t_log.error(\"Failed to query leaderboards: result_code=%s\" % EOS.result_str(ret))\n\t\treturn []\n\t\n\tvar count_opts = EOS.Leaderboards.GetLeaderboardDefinitionCountOptions.new()\n\tvar count: int = EOS.Leaderboards.LeaderboardsInterface.get_leaderboard_definition_count(count_opts)\n\n\t_log.debug(\"Got leaderboards: count=%s\" % count)\n\n\tvar leaderboards = []\n\tfor i in count:\n\t\tvar copy_opts = EOS.Leaderboards.CopyLeaderboardDefinitionByIndexOptions.new()\n\t\tcopy_opts.leaderboard_index = i\n\n\t\tvar copy_ret = EOS.Leaderboards.LeaderboardsInterface.copy_leaderboard_definition_by_index(copy_opts)\n\t\tif not EOS.is_success(copy_ret):\n\t\t\t_log.error(\"Failed to copy leaderboard: result_code=%s\" % EOS.result_str(copy_ret))\n\t\t\tcontinue\n\t\t\n\t\tleaderboards.append(copy_ret.definition)\n\n\treturn leaderboards\n\n\n## Returns an [Array] of [Dictionary] of top records in the leaderboard.\n## Each record has the following data:\n##   leaderboard_id: String - unique id\n##   user_id: String - product user id of user associated with this record\n##   rank: int - sorted position in the leaderboard\n##   score: int - leaderboard score\n##   user_display_name: String - latest display name for the user or empty string if the user doesn't have one\nfunc get_leaderboard_records_async(leaderboard_id: String) -> Array:\n\t_log.debug(\"Getting leaderboard ranks: leaderboard_id=%s\" % leaderboard_id)\n\tvar query_opts = EOS.Leaderboards.QueryLeaderboardRanksOptions.new()\n\tquery_opts.leaderboard_id = leaderboard_id\n\tEOS.Leaderboards.LeaderboardsInterface.query_leaderboard_ranks(query_opts)\n\n\tvar ret = await IEOS.leaderboards_interface_query_leaderboard_ranks_callback\n\tif not EOS.is_success(ret):\n\t\t_log.error(\"Failed to query leaderboard ranks: result_code=%s\" % EOS.result_str(ret))\n\t\treturn []\n\t\n\tvar count_opts = EOS.Leaderboards.GetLeaderboardRecordCountOptions.new()\n\tvar count = EOS.Leaderboards.LeaderboardsInterface.get_leaderboard_record_count(count_opts)\n\n\tvar records = []\n\tfor i in count:\n\t\tvar copy_opts = EOS.Leaderboards.CopyLeaderboardRecordByIndexOptions.new()\n\t\tcopy_opts.leaderboard_record_index = i\n\t\tvar copy_ret = EOS.Leaderboards.LeaderboardsInterface.copy_leaderboard_record_by_index(copy_opts)\n\t\tif not EOS.is_success(copy_ret):\n\t\t\t_log.error(\"Failed to copy leaderboard record: result_code=%s\" % EOS.result_str(copy_ret))\n\t\t\tcontinue\n\t\trecords.append(copy_ret.record)\n\n\treturn records\n\n\n#endregion\n\n\n#region Private methods\n\n#endregion\n"
  },
  {
    "path": "sample/addons/epic-online-services-godot/heos/hleaderboards.gd.uid",
    "content": "uid://b06khhf20mplm\n"
  },
  {
    "path": "sample/addons/epic-online-services-godot/heos/hlobbies.gd",
    "content": "extends Node\n\n\n#region Public vars\n\n## The maximum number of lobbies to return in search calls.[br]\n## Except for [method create_search] and [method search_async]\nvar max_search_results = 25\n\n## Whether to show the lobby in the user's presence\nvar presence_enabled = true\n\n## Local RTC options for the lobby[br]\n## (Optional) You can override any of the below keys.[br]\n## A [Dictionary] with keys:[br]\n## - flags: A bitwise-or union of [enum EOS.RTC.JoinRoomFlags][br]\n## - use_manual_audio_input: [bool][br]\n## - use_manual_audio_output: [bool][br]\n## - local_audio_device_input_starts_muted: [bool]\nvar local_rtc_options = {\n\tflags = EOS.RTC.JoinRoomFlags.EnableDataChannel\n}\n\n#endregion\n\n\n#region Private vars \n\nvar _log = HLog.logger(\"HLobbies\")\n\n#endregion\n\n\n#region Public methods\n\n## Create a new lobby. Returns [HLobby] or [null]\nfunc create_lobby_async(opts: EOS.Lobby.CreateLobbyOptions) -> HLobby:\n\t_log.debug(\"Creating lobby...\")\n\tEOS.Lobby.LobbyInterface.create_lobby(opts)\n\n\tvar ret = await IEOS.lobby_interface_create_lobby_callback\n\tif not EOS.is_success(ret):\n\t\t_log.error(\"Failed to create lobby: %s\" % EOS.result_str(ret))\n\t\treturn null\n\t\n\t_log.debug(\"Lobby created: lobby_id=%s\" % ret.lobby_id)\n\n\tvar lobby = HLobby.new()\n\tlobby.init_from_id(ret.lobby_id)\n\treturn lobby\n\n\n## Join an existing lobby by id. It should only be used if the lobby has had Join-by-ID enabled.\n## Additionally, Join-by-ID should only be enabled to support native invites on an integrated platform.\n## Returns [HLobby] or [null]\nfunc join_by_id_async(lobby_id: String) -> HLobby:\n\t_log.debug(\"Joining lobby by id: lobby_id=%s\" % lobby_id)\n\n\tvar opts = EOS.Lobby.JoinLobbyByIdOptions.new()\n\topts.lobby_id = lobby_id\n\topts.presence_enabled = presence_enabled\n\topts.local_rtc_options = local_rtc_options\n\tEOS.Lobby.LobbyInterface.join_lobby_by_id(opts)\n\n\tvar ret = await IEOS.lobby_interface_join_lobby_by_id_callback\n\tif not EOS.is_success(ret):\n\t\t_log.error(\"Failed to join lobby: result_code=%s\" % EOS.result_str(ret))\n\t\treturn null\n\n\t_log.debug(\"Lobby joined: lobby_id=%s\" % lobby_id)\n\n\tvar lobby = HLobby.new()\n\tlobby.init_from_id(lobby_id)\n\treturn lobby\n\n\n## Join an existing lobby e.g. one returned from search. \n## Returns [HLobby] or [null]\nfunc join_async(lobby: HLobby):\n\tif not lobby:\n\t\treturn null\n\t_log.debug(\"Joining lobby...\")\n\n\tvar opts = EOS.Lobby.JoinLobbyOptions.new()\n\topts.lobby_details = lobby._lobby_details\n\topts.presence_enabled = presence_enabled\n\topts.local_rtc_options = local_rtc_options\n\tEOS.Lobby.LobbyInterface.join_lobby(opts)\n\n\tvar ret = await IEOS.lobby_interface_join_lobby_callback\n\tif not EOS.is_success(ret):\n\t\t_log.error(\"Failed to join lobby: result_code=%s\" % EOS.result_str(ret))\n\t\treturn null\n\t\n\t_log.debug(\"Lobby joined: lobby_id=%s\" % ret.lobby_id)\n\n\tvar new_lobby = HLobby.new()\n\tnew_lobby.init_from_id(ret.lobby_id)\n\treturn new_lobby\n\n\n## Search for public lobbies that a user is in.\n## Returns [Array] of [HLobby] or null\nfunc search_by_product_user_id_async(product_user_id: String):\n\t_log.debug(\"Searching for lobbies by product user id: product_user_id=%s\" % product_user_id)\n\tvar opts = EOS.Lobby.CreateLobbySearchOptions.new()\n\topts.max_results = max_search_results\n\t\n\tvar search: EOSGLobbySearch = create_search(opts)\n\tif not search:\n\t\treturn null\n\t\n\tsearch.set_target_user_id(product_user_id)\n\n\treturn await search_async(search)\n\n\n\n## Search for public lobbies based on attributes.[br]\n## The input argument can either be a [Dictionary] or an [Array] of [Dictionary].[br]\n## (Note there is an implicit AND operation if multiple search attributes are provided)[br]\n## Each search attribute is a Dictionary having the keys:[br]\n## - key: [String] - the key of the attribute[br]\n## - value: [String] - the value of the attribute[br]\n## - comparison: [enum EOS.ComparisonOp] - Type of comparison to make (default is EOS.ComparisonOp.Equal)[br]\n## Returns [Array] of [HLobby] or null\nfunc search_by_attribute_async(attributes):\n\tif typeof(attributes) == TYPE_DICTIONARY:\n\t\tattributes = [attributes]\n\t_log.debug(\"Searching for lobbies by attributes: attributes=%s\" % str(attributes))\n\tvar opts = EOS.Lobby.CreateLobbySearchOptions.new()\n\topts.max_results = max_search_results\n\t\n\tvar search: EOSGLobbySearch = create_search(opts)\n\tif not search:\n\t\treturn null\n\t\n\tfor attr in attributes:\n\t\tif attr.has(\"comparison\"):\n\t\t\tsearch.set_parameter(attr.key, attr.value, attr.comparison)\n\t\telse:\n\t\t\tsearch.set_parameter(attr.key, attr.value, EOS.ComparisonOp.Equal)\n\n\treturn await search_async(search)\n\n\n## Search for lobby by id. At most will return one lobby.\n## Returns [Array] of [HLobby] or null\nfunc search_by_lobby_id_async(lobby_id: String):\n\t_log.debug(\"Searching for lobbies by lobby id: lobby_id=%s\" % lobby_id)\n\tvar opts = EOS.Lobby.CreateLobbySearchOptions.new()\n\topts.max_results = max_search_results\n\t\n\tvar search: EOSGLobbySearch = create_search(opts)\n\tif not search:\n\t\treturn null\n\t\n\tsearch.set_lobby_id(lobby_id)\n\n\treturn await search_async(search)\n\n\n## Search for lobby by bucket id.\n## Returns [Array] of [HLobby] or null\nfunc search_by_bucket_id_async(bucket_id: String):\n\t_log.debug(\"Searching for lobbies by bucket id: bucket_id=%s\" % bucket_id)\n\treturn await HLobbies.search_by_attribute_async({\n\t\tkey = EOS.Lobby.SEARCH_BUCKET_ID,\n\t\tvalue = bucket_id,\n\t\tcomparison = EOS.ComparisonOp.Equal\n\t})\n\n\n## (Advanced) Create a new lobby search. Returns [EOSGLobbySearch] or null. Use [search_async] to perform the search.\nfunc create_search(opts: EOS.Lobby.CreateLobbySearchOptions):\n\t_log.debug(\"Creating lobby search...\")\n\t\n\tvar create_ret = EOS.Lobby.LobbyInterface.create_lobby_search(opts)\n\tif not EOS.is_success(create_ret):\n\t\t_log.error(\"Failed to create lobby search: result_code=%s\" % EOS.result_str(create_ret))\n\t\treturn null\n\t\n\treturn create_ret.lobby_search\n\n\n## (Advanced) Perform the lobby search. Returns [Array] of [HLobby] or null\nfunc search_async(lobby_search: EOSGLobbySearch):\n\t_log.debug(\"Searching for lobbies...\")\n\n\tlobby_search.find(HAuth.product_user_id)\n\n\tvar search_ret = await IEOS.lobby_search_find_callback\n\tif not EOS.is_success(search_ret):\n\t\t_log.error(\"Failed to search for lobbies: result_code=%s\" % EOS.result_str(search_ret))\n\t\treturn null\n\t\n\tvar count = lobby_search.get_search_result_count()\n\t_log.debug(\"Found lobbies: count=%s\" % count)\n\t\n\tvar lobbies: Array[HLobby] = []\n\tfor search_idx in count:\n\t\tvar copy_ret = lobby_search.copy_search_result_by_index(search_idx)\n\t\tif not EOS.is_success(copy_ret):\n\t\t\t_log.error(\"Failed to copy lobby search result by index: result_code=%s\" % EOS.result_str(copy_ret))\n\t\t\tcontinue\n\t\n\t\tvar lobby = HLobby.new()\n\t\tvar details = copy_ret.lobby_details\n\t\tlobby._init_from_details(details)\n\t\tlobbies.append(lobby)\n\t\n\treturn lobbies\n\n#endregion\n"
  },
  {
    "path": "sample/addons/epic-online-services-godot/heos/hlobbies.gd.uid",
    "content": "uid://6iqvm33q0tb1\n"
  },
  {
    "path": "sample/addons/epic-online-services-godot/heos/hlobby.gd",
    "content": "## A high-level lobby wrapper for EOSG\nclass_name HLobby\nextends BaseClass\n\n\n#region Signals\n\n## Emitted when anything about the lobby changes. Except when kicked or lobby is destroyed. Connect to kicked_from_lobby for the latter.\nsignal lobby_updated\n\n## Emitted when the current user is kicked from lobby or the lobby was destroyed\nsignal kicked_from_lobby\n\n## Emitted when another member is promoted to the lobby owner. Use get_owner to get the new owner\nsignal lobby_owner_changed\n\n## Emitted when the current user in the lobby receives data through the RTC data channel\nsignal rtc_data_received\n\n#endregion\n\n\n#region Public vars\n\nvar lobby_id: String\nvar owner_product_user_id: String\nvar bucket_id: String\n\nvar max_members: int\nvar available_slots: int\nvar members: Array[HLobbyMember] = []\nvar allow_invites: bool\nvar permission_level: EOS.Lobby.LobbyPermissionLevel\n\nvar presence_enabled: bool\nvar allow_host_migration: bool\n\n## [Array] of [Dictionary] having {\"key\": String, \"value\": Variant, \"visibility\": [enum EOS.Lobby.LobbyAttributeVisibility] }\nvar attributes = []\n\nvar rtc_room_enabled: bool\nvar rtc_room_name: String\nvar rtc_room_connected: bool\n\nvar allow_join_by_id: bool\nvar rejoin_after_kick_requires_invite: bool\nvar allowed_platform_ids: Array\n\n#endregion\n\n\n#region Private vars\n\nvar _log = HLog.logger(\"HLobby\")\n\nvar _attributes_to_add = []\nvar _lobby_details: EOSGLobbyDetails\n\nvar _connected_to_lobby_events = false\nvar _connected_to_rtc_events = false\nvar _notif_rtc_parti_status_changed = EOS.NotificationIdInvalid\nvar _notif_rtc_audio_parti_updated = EOS.NotificationIdInvalid\nvar _notif_rtc_data_parti_updated = EOS.NotificationIdInvalid\nvar _notif_rtc_data_data_received = EOS.NotificationIdInvalid\n\n#endregion\n\n\n#region Built-in methods\n\nfunc _init() -> void:\n\tsuper._init(\"HLobby\")\n\n\nfunc _notification(what: int) -> void:\n\tif what == NOTIFICATION_PREDELETE:\n\t\t_lobby_details = null\n\n#endregion\n\n\n#region Public methods\n\n## Check whether the lobby is valid\nfunc is_valid() -> bool:\n\treturn lobby_id != \"\"\n\n\n## Check whether a user is the lobby owner\n## By default it will check the current logged in user\nfunc is_owner(product_user_id = HAuth.product_user_id) -> bool:\n\treturn owner_product_user_id == product_user_id\n\n\n## Returns a [HLobbyMember] based on product user id or null\nfunc get_member_by_product_user_id(product_user_id: String) -> HLobbyMember:\n\tfor mem in members:\n\t\tif mem.product_user_id == product_user_id:\n\t\t\treturn mem\n\treturn null\n\n\n## Returns the current lobby member [HLobbyMember] or null\nfunc get_current_member() -> HLobbyMember:\n\tfor mem in members:\n\t\tif mem.product_user_id == HAuth.product_user_id:\n\t\t\treturn mem\n\treturn null\n\n\n## Returns [HLobbyMember] or null\nfunc get_owner() -> HLobbyMember:\n\tfor mem in members:\n\t\tif mem.product_user_id == owner_product_user_id:\n\t\t\treturn mem\n\treturn null\n\n\n## Intialize the lobby from a lobby_id\nfunc init_from_id(p_lobby_id: String):\n\t_log.debug(\"Initializing from lobby id: %s\" % p_lobby_id)\n\tlobby_id = p_lobby_id\n\n\t_copy_lobby_data()\n\n\tif is_valid() and get_current_member() and not _connected_to_lobby_events:\n\t\t_connected_to_lobby_events = true\n\t\tIEOS.lobby_interface_lobby_update_received_callback.connect(_on_lobby_update_received_callback)\n\t\tIEOS.lobby_interface_lobby_member_update_received_callback.connect(_on_lobby_interface_lobby_member_update_received_callback)\n\t\tIEOS.lobby_interface_lobby_member_status_received_callback.connect(_on_lobby_member_status_received_callback)\n\t\tIEOS.lobby_interface_rtc_room_connection_changed_callback.connect(_on_lobby_interface_rtc_room_connection_changed_callback)\n\t\tIEOS.lobby_interface_leave_lobby_requested_callback.connect(_on_lobby_interface_leave_lobby_requested_callback)\n\n\t\t# RTC\n\t\tIEOS.rtc_interface_participant_status_changed.connect(_on_rtc_interface_participant_status_changed)\n\t\tIEOS.rtc_audio_participant_updated.connect(_on_rtc_audio_participant_updated)\n\t\tIEOS.rtc_data_participant_updated.connect(_on_rtc_data_participant_updated)\n\t\tIEOS.rtc_data_data_received.connect(_on_rtc_data_data_received)\n\n\n\n## Returns [Dictionary] or empty [Dictionary] if not found.\nfunc get_attribute(key: String):\n\tfor attr in attributes:\n\t\tif attr.key == key:\n\t\t\treturn attr\n\treturn {}\n\n\n## Add an attribute to this lobby. Make sure to call update_async to actually update the lobby. Returns true if success.\nfunc add_attribute(key: String, value: Variant, visibility = EOS.Lobby.LobbyAttributeVisibility.Public) -> bool:\n\tvar attr = make_attribute(key, value, visibility)\n\t_attributes_to_add.append(attr)\n\treturn true\n\n\n## Returns the current user's attribute as [Dictionary] or empty [Dictionary] if not found.\nfunc get_current_member_attribute(key: String):\n\tvar member = get_member_by_product_user_id(HAuth.product_user_id)\n\tif not member:\n\t\treturn {}\n\tfor attr in member.attributes:\n\t\tif attr.key == key:\n\t\t\treturn attr\n\treturn {}\n\n\n## Add an attribute to the current user in the lobby. Make sure to call update_async to actually update the lobby. Returns true if success.\nfunc add_current_member_attribute(key: String, value: Variant, visibility = EOS.Lobby.LobbyAttributeVisibility.Public) -> bool:\n\tvar member = get_member_by_product_user_id(HAuth.product_user_id)\n\tif not member:\n\t\treturn false\n\t\n\tvar attr = make_attribute(key, value, visibility)\n\tmember._attributes_to_add.append(attr)\n\treturn true\n\n\n## Helper function to create an attribute with key, value and visibility\nstatic func make_attribute(key: String, value: Variant, visibility = EOS.Lobby.LobbyAttributeVisibility.Public) -> Dictionary:\n\treturn {\n\t\tkey = key,\n\t\tvalue = value,\n\t\tvisibility = visibility\n\t}\n\n\n## Update the lobby, if any changes are pending\nfunc update_async() -> bool:\n\t_log.debug(\"Updating lobby: lobby_id=%s\" % lobby_id)\n\tif not is_valid():\n\t\t_log.error(\"Cannot update invalid lobby\")\n\t\treturn false\n\n\tvar opts = EOS.Lobby.UpdateLobbyModificationOptions.new()\n\topts.lobby_id = lobby_id\n\n\tvar lobby_mod_ret = EOS.Lobby.LobbyInterface.update_lobby_modification(opts)\n\tif not EOS.is_success(lobby_mod_ret):\n\t\t_log.error(\"Failed to create lobby modification: result_code=%s\" % EOS.result_str(lobby_mod_ret))\n\t\treturn false\n\t\n\tvar lobby_mod: EOSGLobbyModification = lobby_mod_ret.lobby_modification\n\n\tif is_owner(HAuth.product_user_id):\n\t\t_log.debug(\"Updating lobby as owner...\")\n\t\tif allowed_platform_ids.size() > 0:\n\t\t\tvar set_allowed_platform_ids_ret = lobby_mod.set_allowed_platform_ids(allowed_platform_ids)\n\t\t\tif not EOS.is_success(set_allowed_platform_ids_ret):\n\t\t\t\t_log.error(\"Failed to set allowed platform ids on lobby modification: result_code=%s\" % EOS.result_str(set_allowed_platform_ids_ret))\n\t\t\t\treturn false\n\n\t\tvar set_bucket_ret = lobby_mod.set_bucket_id(bucket_id)\n\t\tif not EOS.is_success(set_bucket_ret):\n\t\t\t_log.error(\"Failed to set bucket id on lobby modification: result_code=%s\" % EOS.result_str(set_bucket_ret))\n\t\t\treturn false\n\n\t\tvar set_invites_allowed_ret = lobby_mod.set_invites_allowed(allow_invites)\n\t\tif not EOS.is_success(set_invites_allowed_ret):\n\t\t\t_log.error(\"Failed to set invites allowed on lobby modification: result_code=%s\" % EOS.result_str(set_invites_allowed_ret))\n\t\t\treturn false\n\n\t\tvar set_max_members_ret = lobby_mod.set_max_members(max_members)\n\t\tif not EOS.is_success(set_max_members_ret):\n\t\t\t_log.error(\"Failed to set max members on lobby modification: result_code=%s\" % EOS.result_str(set_max_members_ret))\n\t\t\treturn false\n\t\t\n\t\tvar set_perm_ret = lobby_mod.set_permission_level(permission_level)\n\t\tif not EOS.is_success(set_perm_ret):\n\t\t\t_log.error(\"Failed to set permission level on lobby modification: result_code=%s\" % EOS.result_str(set_perm_ret))\n\t\t\treturn false\n\n\t\tvar new_attrs = attributes.duplicate(true)\n\t\tnew_attrs.append_array(_attributes_to_add)\n\t\tfor attr in new_attrs:\n\t\t\tvar add_ret = lobby_mod.add_attribute(attr.key, attr.value, attr.visibility)\n\t\t\tif not EOS.is_success(add_ret):\n\t\t\t\t_log.error(\"Failed to add attribute on lobby modification. Skipping this attribute: result_code=%s, key=%s, value=%s, visibility=%s\" % [EOS.result_str(add_ret), attr.key, attr.value, attr.visibility])\n\t\t_attributes_to_add = []\n\t\n\telse:\n\t\t_log.debug(\"Updating lobby as user...\")\n\n\tvar member: HLobbyMember = get_member_by_product_user_id(HAuth.product_user_id)\n\tif member:\n\t\tvar mem_attrs = member.attributes.duplicate(true)\n\t\tmem_attrs.append_array(member._attributes_to_add)\n\t\tfor attr in mem_attrs:\n\t\t\tvar add_ret = lobby_mod.add_member_attribute(attr.key, attr.value, attr.visibility)\n\t\t\tif not EOS.is_success(add_ret):\n\t\t\t\t_log.error(\"Failed to add member attribute on lobby modification. Skipping this attribute: result_code=%s, key=%s, value=%s, visibility=%s\" % [EOS.result_str(add_ret), attr.key, attr.value, attr.visibility])\n\t\tmember._attributes_to_add = []\n\n\tvar update_opts = EOS.Lobby.UpdateLobbyOptions.new()\n\tupdate_opts.lobby_modification = lobby_mod\n\tEOS.Lobby.LobbyInterface.update_lobby(update_opts)\n\t\n\tvar update_ret = await IEOS.lobby_interface_update_lobby_callback\n\tif not EOS.is_success(update_ret):\n\t\t_log.error(\"Failed to update lobby: result_code=%s. lobby_id=%s\" % [EOS.result_str(update_ret), lobby_id])\n\t\treturn false\n\t\n\t_log.debug(\"Lobby updated successfully: lobby_id=%s\" % lobby_id)\n\n\t_copy_lobby_data()\n\tlobby_updated.emit()\n\n\treturn true\n\t\n\n## Leave the lobby\n## Returns true if the leave was successful\nfunc leave_async() -> bool:\n\tif not is_valid():\n\t\treturn false\n\n\t_log.debug(\"Leaving lobby: lobby_id=%s\" % lobby_id)\n\tvar opts = EOS.Lobby.LeaveLobbyOptions.new()\n\topts.lobby_id = lobby_id\n\tEOS.Lobby.LobbyInterface.leave_lobby(opts)\n\n\tvar ret = await IEOS.lobby_interface_leave_lobby_callback\n\tif not EOS.is_success(ret):\n\t\t_log.error(\"Failed to leave lobby: result_code=%s\" % EOS.result_str(ret))\n\t\treturn false\n\t\n\t_log.debug(\"Leave lobby successful: lobby_id=%s\" % lobby_id)\n\t_disconnect_from_signals()\n\treturn true\n\n\n## Destroy the lobby. Only the owner can call this.\n## Returns true if the destroy was successful\nfunc destroy_async() -> bool:\n\tif not is_valid():\n\t\treturn false\n\t\n\tif not is_owner():\n\t\treturn false\n\n\t_log.debug(\"Destroying lobby: lobby_id=%s\" % lobby_id)\n\tvar opts = EOS.Lobby.DestroyLobbyOptions.new()\n\topts.lobby_id = lobby_id\n\tEOS.Lobby.LobbyInterface.destroy_lobby(opts)\n\n\tvar ret = await IEOS.lobby_interface_destroy_lobby_callback\n\tif not EOS.is_success(ret):\n\t\t_log.error(\"Failed to destroy lobby: result_code=%s\" % EOS.result_str(ret))\n\t\treturn false\n\t\n\t_log.debug(\"Destroy lobby successful: lobby_id=%s\" % lobby_id)\n\n\tlobby_id = \"\"\n\t_disconnect_from_signals()\n\tkicked_from_lobby.emit()\n\treturn true\n\n\n## Returns true if the current user can invite another user\n## p_product_user_id: The product user id of the user to invite\nfunc can_invite(p_product_user_id: String) -> bool:\n\tif not is_valid():\n\t\treturn false\n\t\n\tif not get_current_member():\n\t\treturn false\n\t\n\tif (not allow_invites) or (not available_slots) or (members.size() >= max_members):\n\t\treturn false\n\t\n\t# Check if in lobby\n\tvar mem = get_member_by_product_user_id(p_product_user_id)\n\tif mem:\n\t\treturn false\n\t\n\treturn true\n\n\n## Send data as a Variant to all users in the lobby's RTC data channel.\n## Note: max packet size is [const EOS.RTCData.MAX_PACKET_SIZE_BYTES] bytes\n## This does not encode objects by default. Use rtc_send_data_raw\n## to encode arbitary data.\nfunc rtc_send_data(data: Variant) -> bool: \n\treturn rtc_send_data_raw(var_to_bytes(data))\n\n\n## Send raw bytes as PackedByteArray to all users in the lobby's RTC data channel\n## Note: max packet size is [const EOS.RTCData.MAX_PACKET_SIZE_BYTES] bytes\nfunc rtc_send_data_raw(data: PackedByteArray) -> bool:\n\tvar opts = EOS.RTCData.SendDataOptions.new()\n\topts.room_name = rtc_room_name\n\topts.data = data\n\tvar res = EOS.RTCData.RTCDataInterface.send_data(opts)\n\treturn EOS.is_success(res)\n\n#endregion\n\n\n#region Private methods\n\nfunc _copy_lobby_data():\n\tvar copy_opts = EOS.Lobby.CopyLobbyDetailsOptions.new()\n\tcopy_opts.lobby_id = lobby_id\n\tvar copy_ret = EOS.Lobby.LobbyInterface.copy_lobby_details(copy_opts)\n\n\tif not EOS.is_success(copy_ret):\n\t\t_log.error(\"Failed to copy lobby details: result_code=%s\" % EOS.result_str(copy_ret))\n\t\treturn\n\n\t_init_from_details(copy_ret.lobby_details)\n\n\nfunc _init_from_details(lobby_details: EOSGLobbyDetails):\n\t_log.debug(\"Initializing from EOSGLobbyDetails\")\n\n\t_lobby_details = lobby_details\n\tvar copy_ret = lobby_details.copy_info()\n\tif not EOS.is_success(copy_ret):\n\t\t_log.error(\"Failed to copy lobby info: result_code=%s\" % EOS.result_str(copy_ret))\n\t\treturn\n\n\tvar details: Dictionary = copy_ret.lobby_details\n\n\tHLog._check_diff_and_set(self, \"lobby_id\", details.lobby_id)\n\tHLog._check_diff_and_set(self, \"owner_product_user_id\", details.lobby_owner_user_id)\n\tHLog._check_diff_and_set(self, \"permission_level\", details.permission_level)\n\tHLog._check_diff_and_set(self, \"available_slots\", details.available_slots)\n\tHLog._check_diff_and_set(self, \"max_members\", details.max_members)\n\tHLog._check_diff_and_set(self, \"allow_invites\", details.allow_invites)\n\tHLog._check_diff_and_set(self, \"bucket_id\", details.bucket_id)\n\tHLog._check_diff_and_set(self, \"allow_host_migration\", details.allow_host_migration)\n\tHLog._check_diff_and_set(self, \"rtc_room_enabled\", details.rtc_room_enabled)\n\tHLog._check_diff_and_set(self, \"allow_join_by_id\", details.allow_join_by_id)\n\tHLog._check_diff_and_set(self, \"rejoin_after_kick_requires_invite\", details.rejoin_after_kick_requires_invite)\n\tHLog._check_diff_and_set(self, \"presence_enabled\", details.presence_enabled)\n\tHLog._check_diff_and_set(self, \"allowed_platform_ids\", details.allowed_platform_ids)\n\n\t# Get attributes\n\tvar attr_count = lobby_details.get_attribute_count()\n\t# _log.verbose(\"Got attributes: count=%s\" % attr_count)\n\tvar orig_attributes = attributes.duplicate(true)\n\tattributes = []\n\tfor attr_idx in attr_count:\n\t\tvar copy_attr_ret = lobby_details.copy_attribute_by_index(attr_idx)\n\t\tif not EOS.is_success(copy_attr_ret):\n\t\t\t_log.error(\"Failed to copy EOSGLobbyDetails attribute by index: result_code=%s\" % EOS.result_str(copy_attr_ret))\n\t\t\tcontinue\n\t\tvar attr = copy_attr_ret.attribute\n\t\tattr = make_attribute(attr.data.key, attr.data.value, attr.visibility)\n\t\tattributes.append(attr)\n\t\n\tHLog._check_attr_diff(orig_attributes, attributes, \"lobby\")\n\n\t# Get members\n\tvar members_count = lobby_details.get_member_count()\n\t# _log.verbose(\"Got members: count=%s\" % members_count)\n\tvar old_members = members.duplicate()\n\t\n\tmembers = []\n\tfor member_idx in members_count:\n\t\tvar member_product_user_id = lobby_details.get_member_by_index(member_idx)\n\t\t\n\t\tvar member = old_members.filter(func(m): return m.product_user_id == member_product_user_id)\n\t\tif member.size() > 0:\n\t\t\t_log.verbose(\"Updating existing lobby member\")\n\t\t\tmember = member[0]\n\t\telse:\n\t\t\t_log.verbose(\"Creating new lobby member\")\n\t\t\tmember = HLobbyMember.new(self)\n\t\t\tmember.product_user_id = member_product_user_id\n\t\t\n\t\tmembers.append(member)\n\n\t\t# Member attributes\n\t\tvar mem_attr_count = lobby_details.get_member_attribute_count(member_product_user_id)\n\t\t# _log.verbose(\"Got member attributes: count=%s\" % mem_attr_count)\n\n\t\tvar orig_mem_attr = member.attributes.duplicate(true)\n\t\tmember.attributes = []\n\t\tfor mem_attr_idx in mem_attr_count:\n\t\t\tvar copy_mem_attr_ret = lobby_details.copy_member_attribute_by_index(member_product_user_id, mem_attr_idx)\n\t\t\tif not EOS.is_success(copy_mem_attr_ret):\n\t\t\t\t_log.error(\"Failed to copy EOSGLobbyDetails member attribute by index: result_code=%s\" % EOS.result_str(copy_mem_attr_ret))\n\t\t\t\tcontinue\n\t\t\tvar attr = copy_mem_attr_ret.attribute\n\t\t\tmember.attributes.append(make_attribute(attr.data.key, attr.data.value, attr.visibility))\n\t\tHLog._check_attr_diff(orig_mem_attr, member.attributes, \"member:%s\" % member.product_user_id)\n\t\n\t_subscribe_rtc_events()\n\n\nfunc _on_lobby_update_received_callback(data: Dictionary):\n\tif not is_valid() or data.lobby_id != lobby_id:\n\t\treturn\n\t_log.verbose(\"Got lobby update: lobby_id=%s\" % lobby_id)\n\t_copy_lobby_data()\n\tlobby_updated.emit()\n\n\nfunc _on_lobby_interface_lobby_member_update_received_callback(data: Dictionary):\n\tif not is_valid() or data.lobby_id != lobby_id:\n\t\treturn\n\t_log.verbose(\"Got lobby member update: lobby_id=%s\" % lobby_id)\n\t_copy_lobby_data()\n\tlobby_updated.emit()\n\n\nfunc _on_lobby_member_status_received_callback(data: Dictionary):\n\tif not is_valid() or data.lobby_id != lobby_id:\n\t\treturn\n\tvar member_id = data.target_user_id\n\tvar status = data.current_status\n\n\t_log.verbose(\"Got lobby member status: member_id=%s, status=%s\" % [member_id, EOS.Lobby.LobbyMemberStatus.find_key(status)])\n\n\tvar update_lobby = true\n\tif HAuth.product_user_id == data.target_user_id:\n\t\tif status == EOS.Lobby.LobbyMemberStatus.Closed or status == EOS.Lobby.LobbyMemberStatus.Kicked or status == EOS.Lobby.LobbyMemberStatus.Disconnected:\n\t\t\t_log.debug(\"Kicked from lobby: lobby_id=%s\" % lobby_id)\n\t\t\tlobby_id = \"\"\n\t\t\t_disconnect_from_signals()\n\t\t\tkicked_from_lobby.emit()\n\t\t\tupdate_lobby = false\n\n\tif update_lobby:\n\t\t_copy_lobby_data()\n\t\tlobby_updated.emit()\n\t\n\tif status == EOS.Lobby.LobbyMemberStatus.Promoted:\n\t\t_log.debug(\"Lobby owner changed: lobby_id=%s\" % lobby_id)\n\t\tlobby_owner_changed.emit()\n\n\nfunc _on_lobby_interface_rtc_room_connection_changed_callback(data: Dictionary):\n\tif not is_valid() or data.lobby_id != lobby_id:\n\t\treturn\n\t\n\tif data.local_user_id != HAuth.product_user_id:\n\t\treturn\n\n\tvar new_rtc_room_connected = data.is_connected\n\tvar disconnect_reason = data.disconnect_reason\n\t_log.debug(\"Lobby rtc room connection changed: lobby_id=%s, is_connected=%s, disconnect_reason=%s\" % [lobby_id, new_rtc_room_connected, EOS.result_str(disconnect_reason)])\n\n\tHLog._check_diff_and_set(self, \"rtc_room_connected\", new_rtc_room_connected)\n\n\tvar mem = get_current_member()\n\tif mem:\n\t\tvar did_update = HLog._check_diff_and_set_dict(mem.rtc_state, \"is_in_rtc_room\", new_rtc_room_connected, \"member:\" + mem.product_user_id)\n\t\tif not new_rtc_room_connected:\n\t\t\tdid_update = HLog._check_diff_and_set_dict(mem.rtc_state, \"is_talking\", false, \"member:\" + mem.product_user_id) or did_update\n\t\tif did_update:\n\t\t\tmem.rtc_state_updated.emit()\n\t\t\n\tlobby_updated.emit()\n\n\nfunc _on_lobby_interface_leave_lobby_requested_callback(data: Dictionary):\n\tif not is_valid() or data.lobby_id != lobby_id:\n\t\treturn\n\n\t_log.debug(\"Lobby leave requested from UI: lobby_id=%s\" % lobby_id)\n\tleave_async()\n\n\nfunc _subscribe_rtc_events():\n\tif not is_valid() or not rtc_room_enabled:\n\t\treturn\n\t\n\tvar mem = get_member_by_product_user_id(HAuth.product_user_id)\n\tif mem == null:\n\t\treturn\n\t\n\t_log.verbose(\"Subscribing to rtc events\")\n\t\n\t\n\t# _log.verbose(\"Subscribing to lobby rtc events\")\n\tvar did_update = false\n\n\t# RTC room name\n\tvar opts = EOS.Lobby.GetRtcRoomNameOptions.new()\n\topts.lobby_id = lobby_id\n\tvar ret = EOS.Lobby.LobbyInterface.get_rtc_room_name(opts)\n\tif not EOS.is_success(ret):\n\t\t_log.error(\"Failed to get rtc room name: result_code=%s\" % EOS.result_str(ret))\n\telse:\n\t\tdid_update = HLog._check_diff_and_set(self, \"rtc_room_name\", ret.rtc_room_name) or did_update\n\t\n\t# RTC connection status\n\tvar is_conn_opts = EOS.Lobby.IsRtcRoomConnectedOptions.new()\n\tis_conn_opts.lobby_id = lobby_id\n\tvar is_conn_ret = EOS.Lobby.LobbyInterface.is_rtc_room_connected(is_conn_opts)\n\tif not EOS.is_success(is_conn_ret):\n\t\t_log.error(\"Failed to get rtc room connection status: result_code=%s\" % EOS.result_str(is_conn_ret))\n\telse:\n\t\tdid_update = HLog._check_diff_and_set(self, \"rtc_room_connected\", is_conn_ret.is_connected) or did_update\n\t\n\n\tif rtc_room_name and not _connected_to_rtc_events:\n\t\t_connected_to_rtc_events = true\n\t\n\t\t# RTC room participant status changes\n\t\tvar notify_parti_status_opts = EOS.RTC.AddNotifyParticipantStatusChangedOptions.new()\n\t\tnotify_parti_status_opts.room_name = rtc_room_name\n\t\t_notif_rtc_parti_status_changed = EOS.RTC.RTCInterface.add_notify_participant_status_changed(notify_parti_status_opts)\n\t\t\n\t\t# RTC audio updates\n\t\tvar notify_audio_parti_updated = EOS.RTCAudio.AddNotifyParticipantUpdatedOptions.new()\n\t\tnotify_audio_parti_updated.room_name = rtc_room_name\n\t\t_notif_rtc_audio_parti_updated = EOS.RTCAudio.RTCAudioInterface.add_notify_participant_updated(notify_audio_parti_updated)\n\n\n\t\t# RTC Data participant updated\n\t\tvar notify_rtc_data_parti_updated = EOS.RTCData.AddNotifyParticipantUpdatedOptions.new()\n\t\tnotify_rtc_data_parti_updated.room_name = rtc_room_name\n\t\t_notif_rtc_data_parti_updated = EOS.RTCData.RTCDataInterface.add_notify_participant_updated(notify_rtc_data_parti_updated)\n\n\t\t# RTC Data data received\n\t\tvar notify_data_received_opts = EOS.RTCData.AddNotifyDataReceivedOptions.new()\n\t\tnotify_data_received_opts.room_name = rtc_room_name\n\t\t_notif_rtc_data_data_received = EOS.RTCData.RTCDataInterface.add_notify_data_received(notify_data_received_opts)\n\t\t\n\tif did_update:\n\t\t# _log.verbose(\"Lobby rtc values updated: lobby_id=%s, rtc_room_name=%s, rtc_room_connected=%s\" % [lobby_id, rtc_room_name, rtc_room_connected])\n\t\tlobby_updated.emit()\n\n\nfunc _on_rtc_interface_participant_status_changed(data: Dictionary):\n\tif not is_valid() or data.room_name != rtc_room_name:\n\t\treturn\n\t\n\tvar participant_id = data.participant_id\n\tvar participant_status = data.participant_status\n\n\tvar mem = get_member_by_product_user_id(participant_id)\n\tif not mem:\n\t\t_log.error(\"Got rtc participant status changed for unknown participant: participant_id=%s\" % participant_id)\n\t\treturn\n\n\tif participant_status == EOS.RTC.ParticipantStatus.Joined:\n\t\tmem.rtc_state.is_in_rtc_room = true\n\t\tmem.rtc_state_updated.emit()\n\telif participant_status == EOS.RTC.ParticipantStatus.Left:\n\t\tmem.rtc_state.is_in_rtc_room = false\n\t\tmem.rtc_state_updated.emit()\n\t\n\tlobby_updated.emit()\n\n\nfunc _on_rtc_audio_participant_updated(data: Dictionary):\n\tif not is_valid() or data.room_name != rtc_room_name:\n\t\treturn\n\t\n\tvar participant_puid = data.participant_id\n\tvar is_talking = data.speaking\n\tvar is_audio_disabled = data.audio_status != EOS.RTCAudio.AudioStatus.Enabled\n\tvar is_hard_muted = data.audio_status == EOS.RTCAudio.AudioStatus.AdminDisabled\n\t\n\tvar mem = get_member_by_product_user_id(data.participant_id)\n\tif mem == null:\n\t\t_log.error(\"Got rtc audio participant update for unknown participant: participant_id=%s\" % participant_puid)\n\t\treturn\n\n\t# Update talking status\n\tvar did_change = HLog._check_diff_and_set_dict(mem.rtc_state, \"is_talking\", is_talking, \"member:\" + mem.product_user_id)\n\n\t# Update audio output status for other players\n\tif mem.product_user_id != HAuth.product_user_id:\n\t\tdid_change = HLog._check_diff_and_set_dict(mem.rtc_state, \"is_audio_output_disabled\", is_audio_disabled, \"member:\" + mem.product_user_id) or did_change\n\telse:\n\t\t# I could have been hard-muted by the lobby owner\n\t\tdid_change = HLog._check_diff_and_set_dict(mem.rtc_state, \"is_hard_muted\", is_hard_muted, \"member:\" + mem.product_user_id) or did_change\n\n\tif did_change:\n\t\tmem.rtc_state_updated.emit()\n\t\tlobby_updated.emit()\n\n\nfunc _on_rtc_data_participant_updated(data: Dictionary):\n\tif not is_valid() or data.room_name != rtc_room_name:\n\t\treturn\n\t\n\tvar participant_puid = data.participant_id\n\tvar data_status = data.data_status\n\n\t_log.debug(\"Got rtc data participant update: participant_id=%s, data_status=%s\" % [participant_puid, EOS.RTCData.DataStatus.find_key(data_status)])\n\n\nfunc _on_rtc_data_data_received(p_data: Dictionary):\n\tif not is_valid() or p_data.room_name != rtc_room_name:\n\t\treturn\n\t\n\trtc_data_received.emit(p_data.data)\n\n\nfunc _disconnect_from_signals() -> void:\n\t_disconnect_signal_if_connected(IEOS, \"lobby_interface_lobby_update_received_callback\", _on_lobby_interface_lobby_member_update_received_callback)\n\t_disconnect_signal_if_connected(IEOS, \"lobby_interface_lobby_member_update_received_callback\", _on_lobby_interface_lobby_member_update_received_callback)\n\t_disconnect_signal_if_connected(IEOS, \"lobby_interface_lobby_member_status_received_callback\", _on_lobby_member_status_received_callback)\n\t_disconnect_signal_if_connected(IEOS, \"lobby_interface_rtc_room_connection_changed_callback\", _on_lobby_interface_rtc_room_connection_changed_callback)\n\t_disconnect_signal_if_connected(IEOS, \"lobby_interface_leave_lobby_requested_callback\", _on_lobby_interface_leave_lobby_requested_callback)\n\n\t# RTC\n\t_disconnect_signal_if_connected(IEOS, \"rtc_interface_participant_status_changed\", _on_rtc_interface_participant_status_changed)\n\t_disconnect_signal_if_connected(IEOS, \"rtc_audio_participant_updated\", _on_rtc_audio_participant_updated)\n\t_disconnect_signal_if_connected(IEOS, \"rtc_data_participant_updated\", _on_rtc_data_participant_updated)\n\t_disconnect_signal_if_connected(IEOS, \"rtc_data_data_received\", _on_rtc_data_data_received)\n\n\tif _notif_rtc_parti_status_changed != EOS.NotificationIdInvalid:\n\t\tEOS.RTC.RTCInterface.remove_notify_participant_status_changed(_notif_rtc_parti_status_changed)\n\tif _notif_rtc_audio_parti_updated != EOS.NotificationIdInvalid:\n\t\tEOS.RTCAudio.RTCAudioInterface.remove_notify_participant_updated(_notif_rtc_audio_parti_updated)\n\tif _notif_rtc_data_parti_updated != EOS.NotificationIdInvalid:\n\t\tEOS.RTCData.RTCDataInterface.remove_notify_participant_updated(_notif_rtc_data_parti_updated)\n\tif _notif_rtc_data_data_received != EOS.NotificationIdInvalid:\n\t\tEOS.RTCData.RTCDataInterface.remove_notify_data_received(_notif_rtc_data_data_received)\n\n\nfunc _disconnect_signal_if_connected(p_obj, p_signal_name, p_callback):\n\tif p_obj.is_connected(p_signal_name, p_callback):\n\t\tp_obj.disconnect(p_signal_name, p_callback)\n\n#endregion\n"
  },
  {
    "path": "sample/addons/epic-online-services-godot/heos/hlobby.gd.uid",
    "content": "uid://dk65c5tvqlm1a\n"
  },
  {
    "path": "sample/addons/epic-online-services-godot/heos/hlobbymember.gd",
    "content": "## A high-level lobby member wrapper for EOSG\nclass_name HLobbyMember\nextends BaseClass\n\n\n#region Signals\n\n## Emitted when the member's rtc state changes\nsignal rtc_state_updated\n\n#endregion\n\n\n#region Public vars\n\nvar product_user_id: String\nvar epic_account_id: String\nvar display_name: String\n\n## [Array] of [Dictionary] having {\"key\": String, \"value\": Variant, \"visibility\": [enum EOS.Lobby.LobbyAttributeVisibility] }\nvar attributes = []\n\nvar rtc_state = {\n\tis_in_rtc_room = false,\n\tis_talking = false,\n\tis_locally_muted = false,\n\tis_hard_muted = false,\n\tis_audio_output_disabled = false,\n}\n\n#endregion\n\n\n#region Private vars\n\nvar _attributes_to_add = []\n\nvar _lobby: HLobby\n\nvar _log = HLog.logger(\"HLobbyMember\")\n\n#endregion\n\n\n#region Built-in methods\n\nfunc _init(p_lobby: HLobby) -> void:\n\tsuper._init(\"HLobbyMember\")\n\n\t_lobby = p_lobby\n\n#endregion\n\n\n#region Public methods\n\n## Returns the member's attribute as [Dictionary] or empty [Dictionary] if not found\nfunc get_attribute(key: String):\n\tfor attr in attributes:\n\t\tif attr.key == key:\n\t\t\treturn attr\n\treturn {}\n\n\n## Returns true if this member is muted\nfunc is_muted() -> bool:\n\tif HAuth.product_user_id == product_user_id:\n\t\treturn rtc_state.is_audio_output_disabled\n\telse:\n\t\treturn rtc_state.is_locally_muted\n\n\n## Returns true if this member is hard muted\nfunc is_hard_muted() -> bool:\n\treturn rtc_state.is_hard_muted\n\n\n## Returns true if this member is the lobby owner\nfunc is_owner() -> bool:\n\treturn _lobby.owner_product_user_id == product_user_id\n\n\n## Mute/Unmute this member.\n## If the member is the current user, it will mute/unmute the audio output.\n## If the member is a remote user, it will locally mute/unmute the remote user's audio.\nfunc toggle_mute_member_async() -> bool:\n\tvar _is_muted = is_muted()\n\tvar action = \"Unmuting\" if _is_muted else \"Muting\"\n\n\tif not _lobby or not _lobby.rtc_room_name:\n\t\treturn false\n\t\n\tif HAuth.product_user_id == product_user_id:\n\t\t# Toggle our mute/unmute status\n\t\t_log.debug(\"%s ourself\" % action)\n\t\t\n\t\tvar opts := EOS.RTCAudio.UpdateSendingOptions.new()\n\t\topts.room_name = _lobby.rtc_room_name\n\t\topts.audio_status = EOS.RTCAudio.AudioStatus.Enabled if _is_muted else EOS.RTCAudio.AudioStatus.Disabled\n\t\t\n\t\tEOS.RTCAudio.RTCAudioInterface.update_sending(opts)\n\t\tvar ret = await IEOS.rtc_audio_interface_update_sending_callback\n\t\tif not EOS.is_success(ret):\n\t\t\t_log.error(\"Failed to update audio sending: result_code=%s\" % EOS.result_str(ret))\n\t\t\treturn false\n\t\t\n\t\tvar did_update = HLog._check_diff_and_set_dict(rtc_state, \"is_audio_output_disabled\", ret.audio_status == EOS.RTCAudio.AudioStatus.Disabled, \"member:\" + product_user_id)\n\t\tif did_update:\n\t\t\trtc_state_updated.emit()\n\t\t\t_lobby.lobby_updated.emit()\n\n\t\treturn true\n\telse:\n\t\t_log.debug(\"%s member: product_user_id=%s\" % [action, product_user_id])\n\t\t# Locally mute the remote user's audio\n\t\tvar opts := EOS.RTCAudio.UpdateReceivingOptions.new()\n\t\topts.room_name = _lobby.rtc_room_name\n\t\topts.participant_id = product_user_id\n\t\topts.audio_enabled = _is_muted\n\n\t\tEOS.RTCAudio.RTCAudioInterface.update_receiving(opts)\n\t\tvar ret = await IEOS.rtc_audio_interface_update_receiving_callback\n\t\tif not EOS.is_success(ret):\n\t\t\t_log.error(\"Failed to update audio receiving: result_code=%s\" % EOS.result_str(ret))\n\t\t\treturn false\n\t\t\n\t\tvar did_update = HLog._check_diff_and_set_dict(rtc_state, \"is_locally_muted\", ret.audio_enabled == false, \"member:\" + product_user_id)\n\t\tif did_update:\n\t\t\trtc_state_updated.emit()\n\t\t\t_lobby.lobby_updated.emit()\n\t\n\treturn true\n\n\n## Hard mute this member in the lobby, can't speak but can hear other members of the lobby\nfunc toggle_hard_mute_member_async() -> bool:\n\tif not _lobby.is_owner():\n\t\treturn false\n\tvar _is_hard_muted = is_hard_muted()\n\tvar action = \"Un hard-muting\" if _is_hard_muted else \"Hard-muting\"\n\t_log.debug(\"%s member: product_user_id=%s\" % [action, product_user_id])\n\n\tvar opts := EOS.Lobby.HardMuteMemberOptions.new()\n\topts.lobby_id = _lobby.lobby_id\n\topts.target_user_id = product_user_id\n\topts.hard_mute = not _is_hard_muted\n\tEOS.Lobby.LobbyInterface.hard_mute_member(opts)\n\n\tvar ret = await IEOS.lobby_interface_hard_mute_member_callback\n\tif not EOS.is_success(ret):\n\t\t_log.error(\"Failed to %s member: result_code=%s\" % [action, EOS.result_str(ret)])\n\t\treturn false\n\t\n\trtc_state.is_hard_muted = not _is_hard_muted\n\trtc_state_updated.emit()\n\t_lobby.lobby_updated.emit()\n\t\n\treturn true\n\n\n## Kick this member from the lobby. Only lobby owner can kick a member.\nfunc kick_member_async() -> bool:\n\tif not _lobby.is_owner():\n\t\treturn false\n\t\n\t_log.debug(\"Kicking member: product_user_id=%s\" % product_user_id)\n\n\tvar opts = EOS.Lobby.KickMemberOptions.new()\n\topts.lobby_id = _lobby.lobby_id\n\topts.target_user_id = product_user_id\n\n\tEOS.Lobby.LobbyInterface.kick_member(opts)\n\tvar ret = await IEOS.lobby_interface_kick_member_callback\n\tif not EOS.is_success(ret):\n\t\t_log.error(\"Failed to kick member: result_code=%s\" % EOS.result_str(ret))\n\t\treturn false\n\t\n\t_log.debug(\"Kick member was successful: product_user_id=%s\" % product_user_id)\n\n\treturn true\n\n\n## Promote another member to the lobby owner. Only the lobby owner can promote a member.\nfunc promote_member_async() -> bool:\n\tif not _lobby.is_owner():\n\t\treturn false\n\t\n\t_log.debug(\"Promoting member: product_user_id=%s\" % product_user_id)\n\n\tvar opts = EOS.Lobby.PromoteMemberOptions.new()\n\topts.lobby_id = _lobby.lobby_id\n\topts.target_user_id = product_user_id\n\tEOS.Lobby.LobbyInterface.promote_member(opts)\n\n\tvar ret = await IEOS.lobby_interface_promote_member_callback\n\tif not EOS.is_success(ret):\n\t\t_log.error(\"Failed to promote member: result_code=%s\" % EOS.result_str(ret))\n\t\treturn false\n\t\n\t_log.debug(\"Promote member was successful: product_user_id=%s\" % product_user_id)\n\t\n\treturn true\n\n\n## Returns true if the member is the current logged in user\nfunc is_self() -> bool:\n\treturn product_user_id == HAuth.product_user_id\n\n#endregion\n"
  },
  {
    "path": "sample/addons/epic-online-services-godot/heos/hlobbymember.gd.uid",
    "content": "uid://brdkf3u56ylbk\n"
  },
  {
    "path": "sample/addons/epic-online-services-godot/heos/hlog.gd",
    "content": "## Used for logging by HEOS classes\n##\n## See also [EOS.Logging] for EOS SDK logging\nclass_name HLog\nextends RefCounted\n\nenum LogLevel {\n\tOFF,\n\tERROR,\n\tWARN,\n\tINFO,\n\tDEBUG,\n\tVERBOSE,\n}\n\n## Current log level\nstatic var log_level = LogLevel.INFO\n\n\n## Returns a new logger for the given class name\nstatic func logger(clazz_name: String) -> HEOSLogger:\n\treturn HEOSLogger.new(clazz_name)\n\n\nstatic func _log_level_str(level: LogLevel) -> String:\n\tmatch level:\n\t\tLogLevel.VERBOSE:\n\t\t\treturn \"VERBOSE\"\n\t\tLogLevel.DEBUG:\n\t\t\treturn \"DEBUG\"\n\t\tLogLevel.INFO:\n\t\t\treturn \"INFO\"\n\t\tLogLevel.WARN:\n\t\t\treturn \"WARN\"\n\t\tLogLevel.ERROR:\n\t\t\treturn \"ERROR\"\n\treturn \"\"\n\n\nstatic func _check_diff_and_set(p_obj: Object, p_key, p_value, p_name = \"\") -> bool:\n\tif p_key in p_obj:\n\t\tvar orig = p_obj.get(p_key)\n\t\tp_obj.set(p_key, p_value)\n\t\tif orig != p_value:\n\t\t\tif log_level >= LogLevel.VERBOSE:\n\t\t\t\tprint_rich(\"[color=yellow]CHANGED %s[/color]: %s = %s -> %s\" % [p_name, p_key, orig, p_value])\n\t\t\treturn true\n\n\treturn false\n\n\nstatic func _check_diff_and_set_dict(p_dict: Dictionary, p_key, p_value, p_name = \"\") -> bool:\n\tif p_dict.has(p_key):\n\t\tvar orig = p_dict[p_key]\n\t\tp_dict[p_key] = p_value\n\t\tif orig != p_value:\n\t\t\tif log_level >= LogLevel.VERBOSE:\n\t\t\t\tprint_rich(\"[color=yellow]CHANGED %s[/color]: %s = %s -> %s\" % [p_name, p_key, orig, p_value])\n\t\t\treturn true\n\treturn false\n\n\nstatic func _check_attr_diff(orig_attrs: Array, new_attrs: Array, p_name = \"\") -> void:\n\tif log_level < LogLevel.VERBOSE:\n\t\treturn\n\n\tvar orig_map: Dictionary = {}\n\tfor attr in orig_attrs:\n\t\torig_map[attr.key] = attr\n\t\n\tvar new_map: Dictionary = {}\n\tfor attr in new_attrs:\n\t\tnew_map[attr.key] = attr\n\t\n\tfor id in orig_map.keys():\n\t\tif not new_map.has(id):\n\t\t\tprint_rich(\"[color=yellow]CHANGED %s[/color]: attr removed: %s = (%s,%s)\" % [p_name, id, orig_map[id].value, orig_map[id].visibility])\n\t\telse:\n\t\t\tvar old_attr = orig_map[id]\n\t\t\tvar new_attr = new_map[id]\n\t\t\tif not (old_attr.value == new_attr.value and old_attr.visibility == new_attr.visibility):\n\t\t\t\tprint_rich(\"[color=yellow]CHANGED %s[/color]: attr updated: %s = (%s,%s) -> (%s,%s)\" % [p_name, id, old_attr.value, old_attr.visibility, new_attr.value, new_attr.visibility])\n\t\n\tfor id in new_map.keys():\n\t\tif not orig_map.has(id):\n\t\t\tprint_rich(\"[color=yellow]CHANGED %s[/color]: attr added: %s = (%s,%s)\" % [p_name, id, new_map[id].value, new_map[id].visibility])\n\n\n## Used internally by HEOS classes for logging\nclass HEOSLogger extends RefCounted:\n\tvar clazz_name: String\n\n\tfunc _init(p_clazz_name) -> void:\n\t\tclazz_name = p_clazz_name\n\n\tfunc verbose(msg: String) -> void:\n\t\t_log(LogLevel.VERBOSE, msg)\n\n\tfunc debug(msg: String) -> void:\n\t\t_log(LogLevel.DEBUG, msg)\n\n\tfunc info(msg: String) -> void:\n\t\t_log(LogLevel.INFO, msg)\n\n\tfunc warn(msg: String) -> void:\n\t\t_log(LogLevel.WARN, msg)\n\n\tfunc error(msg: String) -> void:\n\t\t_log(LogLevel.ERROR, msg)\n\t\n\tfunc _log(level: LogLevel, msg: String) -> void:\n\t\tif level <= HLog.log_level:\n\t\t\tvar timestamp = Time.get_datetime_string_from_system(true, true)\n\t\t\tprint(\"%s [%s] [%s] %s\" % [timestamp, HLog._log_level_str(level), clazz_name, msg])\n\t\n"
  },
  {
    "path": "sample/addons/epic-online-services-godot/heos/hlog.gd.uid",
    "content": "uid://cke8udaaf4kka\n"
  },
  {
    "path": "sample/addons/epic-online-services-godot/heos/hp2p.gd",
    "content": "extends Node\n\n\n#region Public vars\n\n\n#endregion\n\n\n#region Private vars \n\nvar _log = HLog.logger(\"HP2P\")\n\n#endregion\n\n\n#region Public methods\n\n\n## Returns the current user's NAT type\nfunc get_nat_type_async() -> EOS.P2P.NATType:\n\t_log.debug(\"Getting nat type...\")\n\tEOS.P2P.P2PInterface.query_nat_type()\n\t\n\tvar ret = await IEOS.p2p_interface_query_nat_type_callback\n\tif not EOS.is_success(ret):\n\t\t_log.error(\"Failed to get nat type: %s\" % EOS.result_str(ret))\n\telse:\n\t\t_log.debug(\"Got nat type: %s\" % ret.nat_type)\n\n\treturn ret.nat_type\n\n\n## Get the current relay control setting\nfunc get_relay_control() -> EOS.P2P.RelayControl:\n\tvar ret = EOS.P2P.P2PInterface.get_relay_control()\n\tif not EOS.is_success(ret):\n\t\t_log.error(\"Failed to get relay control: %s\" % EOS.result_str(ret))\n\n\treturn ret.relay_control\n\n\n## Set how relay servers are to be used\nfunc set_relay_control(relay_control: EOS.P2P.RelayControl) -> EOS.Result:\n\treturn EOS.P2P.P2PInterface.set_relay_control(relay_control)\n\n\n## Get the current chosen port and the amount of other ports to try above the chosen port if the chosen port is unavailable.\n## Returns a [Dictionary] with the following keys:\n##   - result_code: EOS.Result\n##   - port: int\n##   - max_additional_ports_to_try: int\nfunc get_port_range() -> Dictionary:\n\treturn EOS.P2P.P2PInterface.get_port_range()\n\n\n## Set configuration options related to network ports.\nfunc set_port_range(port: int, max_additional_ports_to_try: int) -> EOS.Result:\n\tvar opts = EOS.P2P.SetPortRangeOptions.new()\n\topts.port = port\n\topts.max_additional_ports_to_try = max_additional_ports_to_try\n\treturn EOS.P2P.P2PInterface.set_port_range(opts)\n\n\n## Gets the current cached information related to the incoming and outgoing packet queues\n## Returns a [Dictionary] with the following keys:\n##   - result_code: EOS.Result\n##   - incoming_packet_queue_current_packet_count: int\n##   - incoming_packet_queue_current_size_bytes: int\n##   - incoming_packet_queue_max_size_bytes: int\n##   - outgoing_packet_queue_current_packet_count: int\n##   - outgoing_packet_queue_current_size_bytes: int\n##   - outgoing_packet_queue_max_size_bytes: int\nfunc get_packet_queue_info():\n\treturn EOS.P2P.P2PInterface.get_packet_queue_info()\n\n\n## Sets the maximum packet queue sizes that packets waiting to be sent or received can use.\nfunc set_packet_queue_size(incoming_packet_queue_max_size_bytes: int, outgoing_packet_queue_max_size_bytes: int) -> EOS.Result:\n\tvar opts = EOS.P2P.SetPacketQueueSizeOptions.new()\n\topts.incoming_packet_queue_max_size_bytes = incoming_packet_queue_max_size_bytes\n\topts.outgoing_packet_queue_max_size_bytes = outgoing_packet_queue_max_size_bytes\n\treturn EOS.P2P.P2PInterface.set_packet_queue_size(opts)\n\n#endregion\n"
  },
  {
    "path": "sample/addons/epic-online-services-godot/heos/hp2p.gd.uid",
    "content": "uid://u6ae5fpm6l8q\n"
  },
  {
    "path": "sample/addons/epic-online-services-godot/heos/hplatform.gd",
    "content": "extends Node\n\n#region Signals\n\n## Emitted when the EOS platform was initialized successfully\nsignal platform_initialized\n\n## Emitted when the EOS platform was created successfully\nsignal platform_created\n\n## Emitted when the EOS SDK produces a log message\n## Use this signal to handle the log however you want\nsignal log_msg(msg: EOS.Logging.LogMessage)\n\n#endregion\n\n\n#region Constants\n\n## Number of times to retry initializing the EOS SDK\nconst INITIALIZE_RETRY_COUNT = 10\n## Delay between retries initializing the EOS SDK in seconds\nconst INITIALIZE_RETRY_DElAY_SEC = 0.2\n\n## Number of times to retry creating the EOS platform\nconst CREATE_RETRY_COUNT = 10\n## Delay between retries creating the EOS platform in seconds\nconst CREATE_RETRY_DElAY_SEC = 0.2\n\n#endregion\n\n\n#region Public vars\n\n## Absolute path to the folder that is going to be used for caching temporary data\nvar cache_directory := ProjectSettings.globalize_path(\"user://eosg-cache\")\n## Platform creation flags. This is a bitwise (union) of [enum EOS.Platform.PlatformFlags]\nvar flags: int = 0\n## Set to true if its a dedicated game server\nvar is_server: bool\n## Override country code for the logged-in user\nvar override_country_code: String\n## Override local code for the logged-in user\nvar override_locale_code: String\n## Budget, measured in milliseconds, for EOS_Platform_Tick to do its work. Set it according to your desired FPS.\nvar tick_budget_in_milliseconds: int\n## Number of seconds for a task to wait for the network to become available before timing out with an EOS_TimedOut error\nvar task_network_timeout_seconds = null # float\n## Configures RTC behavior upon entering to any background application statuses See [enum EOS.Platform.RTCBackgroundMode]\nvar rtc_options_background_mode = null\n\n#endregion\n\n\n#region Private vars \n\nvar _log = HLog.logger(\"HPlatform\")\n\n#endregion\n\n\n#region Built-in methods\n\nfunc _ready() -> void:\n\tIEOS.logging_interface_callback.connect(_on_logging_callback)\n\n#endregion\n\n\n#region Public methods\n\n\n## Easy setup for EOS. Returns true if EOS setup is success.\nfunc setup_eos_async(p_creds: HCredentials) -> bool:\n\t_log.debug(\"Setting up EOS\")\n\t\n\tif not p_creds.product_name:\n\t\t_log.error(\"HCredentials.product_name cannot be empty\")\n\t\treturn false\n\t\n\tvar init_opts = EOS.Platform.InitializeOptions.new()\n\tinit_opts.product_name = p_creds.product_name\n\tinit_opts.product_version = p_creds.product_version\n\t\n\tvar init_ret := await initialize_async(init_opts)\n\tif not EOS.is_success(init_ret):\n\t\treturn false\n\n\tvar create_opts = EOS.Platform.CreateOptions.new()\n\tcreate_opts.product_id = p_creds.product_id\n\tcreate_opts.sandbox_id = p_creds.sandbox_id\n\tcreate_opts.deployment_id = p_creds.deployment_id\n\tcreate_opts.client_id = p_creds.client_id\n\tcreate_opts.client_secret = p_creds.client_secret\n\tcreate_opts.encryption_key = p_creds.encryption_key\n\t\n\tcreate_opts.cache_directory = cache_directory\n\tif not flags:\n\t\t_log.debug(\"Using default flags for creating platform\")\n\t\tif OS.get_name() == \"Windows\":\n\t\t\tcreate_opts.flags = EOS.Platform.PlatformFlags.WindowsEnableOverlayOpengl\n\telse:\n\t\tcreate_opts.flags = flags\n\tcreate_opts.is_server = is_server\n\tcreate_opts.override_country_code = override_country_code\n\tcreate_opts.override_locale_code = override_locale_code\n\tif not tick_budget_in_milliseconds:\n\t\tvar max_fps = max(Engine.get_max_fps()*1.0, 60.0)\n\t\tvar budget_ms = floori((0.3 * 1000) / max_fps)\n\t\tbudget_ms = max(budget_ms, 2) # at least 2ms\n\t\t_log.debug(\"Using default tick_budget_in_milliseconds as %s\" % budget_ms)\n\t\tcreate_opts.tick_budget_in_milliseconds = budget_ms\n\telse:\n\t\tcreate_opts.tick_budget_in_milliseconds = tick_budget_in_milliseconds\n\tcreate_opts.task_network_timeout_seconds = task_network_timeout_seconds\n\tcreate_opts.rtc_options.background_mode = rtc_options_background_mode\n\t\n\tvar is_success := await create_platform_async(create_opts)\n\tif not is_success:\n\t\treturn false\n\t\n\treturn true\n\n\n## Initialize the EOS SDK\nfunc initialize_async(opts: EOS.Platform.InitializeOptions) -> EOS.Result:\n\t_log.debug(\"Initializing EOS SDK\")\n\tvar res := EOS.Platform.PlatformInterface.initialize(opts)\n\t\n\tvar retry_count = INITIALIZE_RETRY_COUNT\n\twhile not EOS.is_success(res) and retry_count > 0:\n\t\tif not EOS.is_success(res) and retry_count > 0:\n\t\t\t_log.debug(\"Failed to initialize EOS SDK: result_code=%s, retry_count=%s\" % [EOS.result_str(res), INITIALIZE_RETRY_COUNT - retry_count + 1])\n\t\t\n\t\tres = EOS.Platform.PlatformInterface.initialize(opts)\n\t\tretry_count -= 1\n\t\tawait get_tree().create_timer(INITIALIZE_RETRY_DElAY_SEC).timeout\n\t\t\n\t\n\tif not (EOS.is_success(res) or res == EOS.Result.AlreadyConfigured):\n\t\t_log.error(\"Failed to initialize EOS SDK: %s\" % EOS.result_str(res))\n\t\treturn res\n\n\t_log.debug(\"EOS SDK initialized: result_code=%s\" % EOS.result_str(res))\n\tif EOS.is_success(res):\n\t\tplatform_initialized.emit()\n\n\treturn res\n\n\n## Set the logging level for the EOS SDK\nfunc set_eos_log_level(log_category: EOS.Logging.LogCategory, log_level: EOS.Logging.LogLevel) -> EOS.Result:\n\tvar log_cat_str = EOS.Logging.LogCategory.find_key(log_category)\n\t_log.verbose(\"Setting log level: log_category=%s, log_level=%s\" % [log_cat_str, log_level])\n\tvar res := EOS.Logging.set_log_level(log_category, log_level)\n\tif not EOS.is_success(res):\n\t\t_log.error(\"Failed to set log level: %s\" % EOS.result_str(res))\n\t\n\treturn res\n\n\n## Create the EOS Platform\nfunc create_platform_async(opts: EOS.Platform.CreateOptions) -> bool:\n\t_log.debug(\"Creating EOS Platform\")\n\tvar res := EOS.Platform.PlatformInterface.create(opts)\n\t\n\tvar retry_count = CREATE_RETRY_COUNT\n\twhile not EOS.is_success(res) and retry_count > 0:\n\t\tif not EOS.is_success(res) and retry_count > 0:\n\t\t\t_log.debug(\"Failed to create EOS Platform: result_code=%s, retry_count=%s\" % [EOS.result_str(res), CREATE_RETRY_COUNT - retry_count + 1])\n\t\t\n\t\tres = EOS.Platform.PlatformInterface.create(opts)\n\t\tretry_count -= 1\n\t\tawait get_tree().create_timer(CREATE_RETRY_DElAY_SEC).timeout\n\t\t\n\t\n\tif not EOS.is_success(res):\n\t\t_log.error(\"Failed to create EOS Platform: %s\" % EOS.result_str(res))\n\t\treturn res\n\t\n\tplatform_created.emit()\n\t\n\treturn res\n\n#endregion\n\n\n#region Private methods\n\nfunc _on_logging_callback(p_msg: Dictionary):\n\tvar msg = EOS.Logging.LogMessage.from(p_msg) as EOS.Logging.LogMessage\n\tlog_msg.emit(msg)\n\n#endregion\n"
  },
  {
    "path": "sample/addons/epic-online-services-godot/heos/hplatform.gd.uid",
    "content": "uid://yl2muvqrdiud\n"
  },
  {
    "path": "sample/addons/epic-online-services-godot/heos/hsessions.gd",
    "content": "extends Node\n\n\n#region Public vars\n\nvar max_search_results = 25\n\n#endregion\n\n\n#region Private vars \n\nvar _log = HLog.logger(\"HSessions\")\n\n#endregion\n\n\n#region Public methods\n\nfunc create_session(opts: EOS.Sessions.CreateSessionModificationOptions) -> EOSGSessionModification:\n\t_log.debug(\"Creating session...\")\n\tvar ret = EOS.Sessions.SessionsInterface.create_session_modification(opts)\n\tif not EOS.is_success(ret):\n\t\t_log.error(\"Failed to create session: %s\" % EOS.result_str(ret))\n\t\treturn null\n\t\n\tvar session_mod = ret.session_modification\n\t\n\t_log.debug(\"Session created session_name=%s, session_id=%s\" % [opts.session_name, opts.session_id])\n\t\n\treturn session_mod\n\n\nfunc update_session_async(p_session: EOSGSessionModification) -> bool:\n\t_log.debug(\"Updating session...\")\n\t\n\tvar opts := EOS.Sessions.UpdateSessionOptions.new()\n\topts.session_modification = p_session\n\tEOS.Sessions.SessionsInterface.update_session(opts)\n\tvar ret = await IEOS.sessions_interface_update_session_callback\n\tif not EOS.is_success(ret):\n\t\t_log.error(\"Failed to update session: %s\" % EOS.result_str(ret))\n\t\treturn false\n\t\n\t_log.debug(\"Session updated session_name=%s, session_id=%s\" % [ret.session_name, ret.session_id])\n\treturn true\n\n\nfunc get_active_session(p_session_name: String) -> EOSGActiveSession:\n\t_log.debug(\"Getting active session... session_name=%s\" % p_session_name)\n\t\n\tvar opts = EOS.Sessions.CopyActiveSessionDetailsOptions.new()\n\topts.session_name = p_session_name\n\tvar ret = EOS.Sessions.SessionsInterface.copy_active_session_details(opts)\n\tif not EOS.is_success(ret):\n\t\t_log.error(\"Failed to get active session: %s\" % EOS.result_str(ret))\n\t\treturn null\n\t\n\t_log.debug(\"Got active session session_name=%s\" % p_session_name)\n\treturn ret.active_session\n\n\nfunc join_async(session: EOSGSessionDetails, session_name: String, presence_enabled = false) -> bool:\n\tif not session:\n\t\treturn false\n\tvar session_id = session.copy_info().info.session_id\n\t_log.debug(\"Joining session... session_name=%s, session_id=%s\" % [session_name, session_id])\n\n\tvar opts = EOS.Sessions.JoinSessionOptions.new()\n\topts.session_details = session\n\topts.presence_enabled = presence_enabled\n\topts.session_name = session_name\n\tEOS.Sessions.SessionsInterface.join_session(opts)\n\n\tvar ret = await IEOS.sessions_interface_join_session_callback\n\tif not EOS.is_success(ret):\n\t\t_log.error(\"Failed to join session session_id=%s: result_code=%s\" % [session_id, EOS.result_str(ret)])\n\t\treturn false\n\n\t_log.debug(\"Session joined: session_id=%s\" % session_id)\n\treturn true\n\n\nfunc search_by_attribute_async(attributes):\n\tif typeof(attributes) == TYPE_DICTIONARY:\n\t\tattributes = [attributes]\n\t\n\t_log.debug(\"Searching for session by attributes: attributes=%s\" % str(attributes))\n\tvar opts = EOS.Sessions.CreateSessionSearchOptions.new()\n\topts.max_search_results = max_search_results\n\t\n\tvar search := create_search(opts)\n\tif not search:\n\t\treturn null\n\t\n\tfor attr in attributes:\n\t\tif attr.has(\"comparison\"):\n\t\t\tsearch.set_parameter(attr.key, attr.value, attr.comparison)\n\t\telse:\n\t\t\tsearch.set_parameter(attr.key, attr.value, EOS.ComparisonOp.Equal)\n\n\treturn await search_async(search)\n\n\n## (Advanced)\nfunc create_search(opts: EOS.Sessions.CreateSessionSearchOptions) -> EOSGSessionSearch:\n\t_log.debug(\"Creating session search...\")\n\t\n\tvar create_ret = EOS.Sessions.SessionsInterface.create_session_search(opts)\n\tif not EOS.is_success(create_ret):\n\t\t_log.error(\"Failed to create session search: result_code=%s\" % EOS.result_str(create_ret))\n\t\treturn null\n\t\n\treturn create_ret.session_search\n\n\n## (Advanced)\nfunc search_async(session_search: EOSGSessionSearch):\n\t_log.debug(\"Searching for sessions...\")\n\n\tsession_search.find(HAuth.product_user_id)\n\n\tvar search_ret = await IEOS.session_search_find_callback\n\tif not EOS.is_success(search_ret):\n\t\t_log.error(\"Failed to search for sessions: result_code=%s\" % EOS.result_str(search_ret))\n\t\treturn null\n\t\n\tvar count = session_search.get_search_result_count()\n\t_log.debug(\"Found sessions: count=%s\" % count)\n\t\n\tvar sessions: Array = []\n\tfor search_idx in count:\n\t\tvar copy_ret = session_search.copy_search_result_by_index(search_idx)\n\t\tif not EOS.is_success(copy_ret):\n\t\t\t_log.error(\"Failed to copy session search result by index: result_code=%s\" % EOS.result_str(copy_ret))\n\t\t\tcontinue\n\t\n\t\tvar details = copy_ret.session_details\n\t\tsessions.append(details)\n\t\n\treturn sessions\n\n#endregion\n"
  },
  {
    "path": "sample/addons/epic-online-services-godot/heos/hsessions.gd.uid",
    "content": "uid://bieh2rxxahuu2\n"
  },
  {
    "path": "sample/addons/epic-online-services-godot/heos/hstats.gd",
    "content": "extends Node\n\n#region Signals\n\n#endregion\n\n\n#region Public vars\n\n#endregion\n\n\n#region Private vars \n\nvar _log = HLog.logger(\"HStats\")\n\n#endregion\n\n\n#region Built-in methods\n\nfunc _ready() -> void:\n\tpass\n\n#endregion\n\n\n#region Public methods\n\n## Returns an [Array] of stats for the current user.\n## Each stat has:\n##  name: String - name of the stat\n##  value: int - current value for the stat\n##  start_time: int - unix timestamp or [EOS.Stats.STATS_TIME_UNDEFINED]\n##  end_time: int - unix timestamp or [EOS.Stats.STATS_TIME_UNDEFINED]\nfunc get_stats_async() -> Array:\n\t_log.debug(\"Getting stats for user...\")\n\tvar query_opts = EOS.Stats.QueryStatsOptions.new()\n\tEOS.Stats.StatsInterface.query_stats(query_opts)\n\n\tvar ret = await IEOS.stats_interface_query_stats_callback\n\tif not EOS.is_success(ret):\n\t\t_log.error(\"Failed to query stats: result_code=%s\" % EOS.result_str(ret))\n\t\treturn []\n\n\tvar stats_count: int = EOS.Stats.StatsInterface.get_stats_count(EOS.Stats.GetStatsCountOptions.new())\n\t_log.debug(\"Got stats: count=%s\" % stats_count)\n\n\tvar stats = []\n\tfor i in range(stats_count):\n\t\tvar copy_opts = EOS.Stats.CopyStatByIndexOptions.new()\n\t\tcopy_opts.stat_index = i\n\t\tvar copy_ret = EOS.Stats.StatsInterface.copy_stat_by_index(copy_opts)\n\t\tif not EOS.is_success(copy_ret):\n\t\t\t_log.error(\"Failed to copy stat: result_code=%s\" % EOS.result_str(copy_ret))\n\t\telse:\n\t\t\tstats.append(copy_ret.stat)\n\treturn stats\n\n\n## Ingest a stat by the specified amount\nfunc ingest_stat_async(stat_name: String, _ingest_amount: int) -> EOS.Result:\n\t_log.debug(\"Ingesting stat: name=%s, amount=%s\" % [stat_name, _ingest_amount])\n\tvar opts = EOS.Stats.IngestStatOptions.new()\n\topts.local_user_id = HAuth.product_user_id\n\topts.target_user_id = HAuth.product_user_id\n\topts.stats = [\n\t\t{stat_name = stat_name, ingest_amount = _ingest_amount},\n\t]\n\tEOS.Stats.StatsInterface.ingest_stat(opts)\n\n\tvar ret = await IEOS.stats_interface_ingest_stat_callback\n\tif not EOS.is_success(ret):\n\t\t_log.error(\"Failed to ingest stat: result_code=%s\" % EOS.result_str(ret))\n\treturn ret.result_code\n\t\n\n#endregion\n\n\n#region Private methods\n\n\n#endregion\n"
  },
  {
    "path": "sample/addons/epic-online-services-godot/heos/hstats.gd.uid",
    "content": "uid://dbckdip83oone\n"
  },
  {
    "path": "sample/addons/epic-online-services-godot/plugin.cfg",
    "content": "[plugin]\n\nname = \"Epic Online Services Godot 4.2+ (EOSG)\"\ndescription = \"Unofficial Epic Online Services for Godot 4.2+ (includes demo project)\"\nauthor = \"3ddelano\"\nversion = \"2.2.9\"\nscript = \"plugin.gd\""
  },
  {
    "path": "sample/addons/epic-online-services-godot/plugin.gd",
    "content": "# Copyright (c) 2023-present Delano Lourenco\n# https://github.com/3ddelano/epic-online-services-godot/\n# MIT License\n@tool\nextends EditorPlugin\n\nvar _export_plugin = preload(\"res://addons/epic-online-services-godot/export_plugin.gd\").new()\n\n\nfunc _enable_plugin():\n\tadd_autoload_singleton(\"EOSGRuntime\", \"res://addons/epic-online-services-godot/runtime.gd\")\n\tadd_autoload_singleton(\"HPlatform\", \"res://addons/epic-online-services-godot/heos/hplatform.gd\")\n\tadd_autoload_singleton(\"HAuth\", \"res://addons/epic-online-services-godot/heos/hauth.gd\")\n\tadd_autoload_singleton(\"HAchievements\", \"res://addons/epic-online-services-godot/heos/hachievements.gd\")\n\tadd_autoload_singleton(\"HFriends\", \"res://addons/epic-online-services-godot/heos/hfriends.gd\")\n\tadd_autoload_singleton(\"HStats\", \"res://addons/epic-online-services-godot/heos/hstats.gd\")\n\tadd_autoload_singleton(\"HLeaderboards\", \"res://addons/epic-online-services-godot/heos/hleaderboards.gd\")\n\tadd_autoload_singleton(\"HLobbies\", \"res://addons/epic-online-services-godot/heos/hlobbies.gd\")\n\tadd_autoload_singleton(\"HP2P\", \"res://addons/epic-online-services-godot/heos/hp2p.gd\")\n\tadd_autoload_singleton(\"HSessions\", \"res://addons/epic-online-services-godot/heos/hsessions.gd\")\n\tadd_export_plugin(_export_plugin)\n\n\nfunc _disable_plugin():\n\tremove_autoload_singleton(\"EOSGRuntime\")\n\tremove_export_plugin(_export_plugin)\n\tremove_autoload_singleton(\"HPlatform\")\n\tremove_autoload_singleton(\"HAuth\")\n\tremove_autoload_singleton(\"HAchievements\")\n\tremove_autoload_singleton(\"HFriends\")\n\tremove_autoload_singleton(\"HStats\")\n\tremove_autoload_singleton(\"HLeaderboards\")\n\tremove_autoload_singleton(\"HLobbies\")\n\tremove_autoload_singleton(\"HP2P\")\n"
  },
  {
    "path": "sample/addons/epic-online-services-godot/plugin.gd.uid",
    "content": "uid://c2bh2munh5110\n"
  },
  {
    "path": "sample/addons/epic-online-services-godot/runtime.gd",
    "content": "# Copyright (c) 2023-present Delano Lourenco\n# https://github.com/3ddelano/epic-online-services-godot/\n# MIT License\n## Runtime controller for Epic Online Services. This is available as the EOSGRuntime autoload.\nclass_name EOSGRuntime_\nextends Node\n\n\n## The Product User ID of the most recent logged in user.\nvar local_product_user_id: String\n\n## The Epic Account ID of the most recent logged in user.\nvar local_epic_account_id: String\n\n\nfunc _ready() -> void:\n\tIEOS.auth_interface_login_callback.connect(func (data: Dictionary):\n\t\tif data.local_user_id != \"\":\n\t\t\tlocal_epic_account_id = data.local_user_id\n\t)\n\n\tIEOS.connect_interface_login_callback.connect(func (data: Dictionary):\n\t\tif data.local_user_id != \"\":\n\t\t\tlocal_product_user_id = data.local_user_id\n\t)\n\n\tIEOS.auth_interface_logout_callback.connect(_on_logout)\n\n\nfunc _on_logout(data: Dictionary):\n\tlocal_epic_account_id = \"\"\n\tlocal_product_user_id = \"\"\n\n\nfunc _process(_delta: float):\n\tIEOS.tick()\n"
  },
  {
    "path": "sample/addons/epic-online-services-godot/runtime.gd.uid",
    "content": "uid://7saywdx0ipep\n"
  },
  {
    "path": "sample/components/StyledPopupWindow/StyledPopupWindow.gd",
    "content": "class_name StyledPopupWindow\nextends PopupPanel\n\n\n@onready var _close_btn = %CloseBtn\n@onready var _title = %Title\n\n\nfunc _ready() -> void:\n\tvisible = false\n\t_close_btn.pressed.connect(hide)\n\n\t_title.text = title\n"
  },
  {
    "path": "sample/components/StyledPopupWindow/StyledPopupWindow.gd.uid",
    "content": "uid://467nklflb1n8\n"
  },
  {
    "path": "sample/components/StyledPopupWindow/StyledPopupWindow.tscn",
    "content": "[gd_scene load_steps=4 format=3 uid=\"uid://dkprjbptror6n\"]\n\n[ext_resource type=\"Theme\" uid=\"uid://dwns7wwoyi1hy\" path=\"res://components/StyledPopupWindow/StyledPopupWindowTheme.tres\" id=\"1_72hut\"]\n[ext_resource type=\"Script\" uid=\"uid://467nklflb1n8\" path=\"res://components/StyledPopupWindow/StyledPopupWindow.gd\" id=\"1_xtvca\"]\n\n[sub_resource type=\"StyleBoxFlat\" id=\"StyleBoxFlat_pe58l\"]\ncontent_margin_left = 7.0\ncontent_margin_right = 6.0\nbg_color = Color(0.196078, 0.196078, 0.196078, 1)\nborder_width_left = 1\nborder_width_top = 1\nborder_width_right = 1\nborder_width_bottom = 1\nborder_color = Color(0.192157, 0.192157, 0.192157, 1)\n\n[node name=\"StyledPopupWindow\" type=\"PopupPanel\"]\ndisable_3d = true\nsize = Vector2i(250, 100)\nvisible = true\ntheme = ExtResource(\"1_72hut\")\nscript = ExtResource(\"1_xtvca\")\n\n[node name=\"VB\" type=\"VBoxContainer\" parent=\".\"]\noffset_left = 4.0\noffset_top = 4.0\noffset_right = 246.0\noffset_bottom = 96.0\ntheme_type_variation = &\"Panel_TitleBar\"\n\n[node name=\"PanelContainer\" type=\"PanelContainer\" parent=\"VB\"]\nlayout_mode = 2\ntheme_type_variation = &\"Panel_TitleBar\"\n\n[node name=\"TitleBar\" type=\"HBoxContainer\" parent=\"VB/PanelContainer\"]\nlayout_mode = 2\n\n[node name=\"Title\" type=\"Label\" parent=\"VB/PanelContainer/TitleBar\"]\nunique_name_in_owner = true\nlayout_mode = 2\nsize_flags_horizontal = 3\ntext = \"POPUP WINDOW TITLE\"\nhorizontal_alignment = 1\n\n[node name=\"CloseBtn\" type=\"Button\" parent=\"VB/PanelContainer/TitleBar\"]\nunique_name_in_owner = true\nlayout_mode = 2\nsize_flags_horizontal = 8\nmouse_default_cursor_shape = 2\ntheme_override_colors/font_color = Color(1, 0, 0, 1)\ntheme_override_colors/font_pressed_color = Color(1, 0, 0, 1)\ntheme_override_colors/font_hover_color = Color(1, 0.345098, 0.345098, 1)\ntheme_override_colors/font_hover_pressed_color = Color(1, 0, 0, 1)\ntheme_override_styles/normal = SubResource(\"StyleBoxFlat_pe58l\")\ntext = \"x\"\n\n[node name=\"MC\" type=\"MarginContainer\" parent=\"VB\"]\nlayout_mode = 2\ntheme_override_constants/margin_left = 20\ntheme_override_constants/margin_top = 20\ntheme_override_constants/margin_right = 20\ntheme_override_constants/margin_bottom = 20\n\n[node name=\"VB\" type=\"VBoxContainer\" parent=\"VB/MC\"]\nlayout_mode = 2\n"
  },
  {
    "path": "sample/components/StyledPopupWindow/StyledPopupWindowTheme.tres",
    "content": "[gd_resource type=\"Theme\" load_steps=26 format=4 uid=\"uid://dwns7wwoyi1hy\"]\n\n[ext_resource type=\"Texture2D\" uid=\"uid://bca7dt4mbam7m\" path=\"res://components/StyledPopupWindow/checkbox_checked.png\" id=\"1_q2c85\"]\n[ext_resource type=\"Texture2D\" uid=\"uid://b81awaq6i80hc\" path=\"res://components/StyledPopupWindow/checkbox_checked_disabled.png\" id=\"2_s6mpo\"]\n[ext_resource type=\"Texture2D\" uid=\"uid://ckxml3rkfinlo\" path=\"res://components/StyledPopupWindow/checkbox_unchecked.png\" id=\"3_gg3vm\"]\n[ext_resource type=\"Texture2D\" uid=\"uid://bt7f80d71sprw\" path=\"res://components/StyledPopupWindow/checkbox_unchecked_disabled.png\" id=\"4_s07s3\"]\n[ext_resource type=\"FontFile\" uid=\"uid://ij5t8dy1m6e6\" path=\"res://fonts/Roboto-Regular.ttf\" id=\"5_kvsd8\"]\n\n[sub_resource type=\"Image\" id=\"Image_bboio\"]\ndata = {\n\"data\": PackedByteArray(\"/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP98//////9O/wD/AP8A/wD/AP+M//////9E/wD/AP8A/wD/AP8A/2D/1v/4/9z/bP8A/wD/AP8A/wD/AP98////YP8A/wD/AP8A/1z///+E/wD/AP8A/wD/AP8A/1P/z//4/+r/lv8L/wD/AP8A/wD/AP9V////vv8A/wD/C//h//j/Kv8A/wD/AP8A/wD/AP9T/8n/9v/x/8f/Lv8A/wD/AP8A/wD/AP9Q/8n/9//x/7P/K/8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/MP///6j/AP8A/wD/AP+w/9L/Ev+q//X/iP8A/wD/AP8A/7D/3P89/8T/9//l/5X/C/8A/wD/AP8A/wD/HP+R/9f/9v/l/6D/Ff8A/wD/AP8A/wD/sP/c/0L/zP/5/+f/iv8V/6P/7//v/7X/Hv8A/wD/AP8A/wD/sP///yj/AP8A/wD/AP8A/wD/AP9U/7z/7v/5/+D/m/8g/wD/AP8A/wD/AP8A/3z///9g/wD/AP8A/2v///+y/wH/AP8A/wD/AP98///////////////0/wD/AP8A/wD/lf/s/x//AP8A/wD/AP8A/wb/8P9U/wD/AP8A/wD/AP8A/wD/AP8A/zz/rf/l//j/4P+o/zb/AP8A/wD/AP8A/zr/vf/u//T/1P+A/wD/AP8A/wD/AP8A/wD/AP8A/3z//////6P/AP8A/wD/AP8B/+L//////0T/AP8A/wD/AP8A/1b////m/53/2////2j/AP8A/wD/AP8A/3z///9g/wD/AP8A/wD/XP///4T/AP8A/wD/AP8A/1f////e/3z/pP///6j/AP8A/wD/AP8A/wD/rP///1//AP+N////ev8A/wD/AP8A/wD/AP9d////8v+l/6T/3v8S/wD/AP8A/wD/AP9Y////7P+b/6j/+//w/yT/AP8A/wD/AP8A/wD/AP8A/wD/AP8w////qP8A/wD/AP8A/7D/9v/B//P/x/9i/wD/AP8A/wD/sP////X/lP9r/8P///+I/wD/AP8A/wD/AP8U/8v/lv94/6D///+s/wD/AP8A/wD/AP+w////8v+K/3H/5v///+z/wP9t/6v///+0/wD/AP8A/wD/AP+w////KP8A/wD/AP8A/wD/AP+P////+v++/6r/1v///+//NP8A/wD/AP8A/wD/fP///2D/AP8A/z3/+v/X/w7/AP8A/wD/AP8A/3z///+//5z/nP+c/5T/AP8A/wD/AP+l//j/Jf8A/wD/AP8A/wD/Tf///1T/AP8A/wD/AP8A/wD/AP8A/23//f/9/8T/rv/V////T/8A/wD/AP8A/w7/8//r/4T/hP+8/5n/AP8A/wD/AP8A/wD/AP8A/wD/fP///8r/8f8H/wD/AP8A/zv////f////RP8A/wD/AP8A/wD/0//7/yP/AP8S/+3/5/8C/wD/AP8A/wD/fP///2D/AP8A/wD/AP9c////hP8A/wD/AP8A/wD/3P/7/yL/AP8A/6r///8r/wD/AP8A/wD/AP8X/+3/6/9F//z/zf8E/wD/AP8A/wD/AP8A/+D//v80/wD/AP8A/wD/AP8A/wD/AP8A/9///f8p/wD/AP9i////ov8A/wD/AP8A/wD/AP8A/wD/AP8A/y////+o/wD/AP8A/wD/sP///9D/Fv8A/wD/AP8A/wD/AP+w////hf8A/wD/Ff///9H/AP8A/wD/AP8A/wD/AP8A/wD/AP/T//H/AP8A/wD/AP8A/7D///9//wD/AP9k////5f8F/wD/BP/q//T/AP8A/wD/AP8A/7D///8o/wD/AP8A/wD/AP9I////5/8p/wD/AP8A/3P////a/wP/AP8A/wD/AP98////YP8A/xz/6P/v/yX/AP8A/wD/AP8A/wD/fP///1z/AP8A/wD/AP8A/wD/AP8A/wH/CP8A/wD/AP8A/wD/aP/1/////////8z/AP8A/wD/AP8A/zP//P/z/z3/AP8A/wD/Kv8C/wD/AP8A/wD/MP///6//AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP98////gf///03/AP8A/wD/k//9/5L///9E/wD/AP8A/wD/F////8P/AP8A/wD/ov///zT/AP8A/wD/AP98////YP8A/wD/AP8A/1z///+E/wD/AP8A/wD/Hf///9L/FP8U/xT/dv///1r/AP8A/wD/AP8A/wD/Xf////z/+v8u/wD/AP8A/wD/AP8A/x7////O/wD/AP8A/wD/AP8A/wD/AP8A/x7////L/wD/AP8A/wf//v/k/wD/AP8A/wD/AP8B/33/5f/3/8L/Uv///6j/AP8A/wD/AP+w////UP8A/wD/AP8A/wD/AP8A/7D///8//wD/AP8A/+7/6v8A/wD/AP8A/wD/Hf+h/+L/+P/8//////8H/wD/AP8A/wD/sP///z3/AP8A/0L///+q/wD/AP8A/8r///8L/wD/AP8A/wD/sP///yj/AP8A/wD/AP8A/7L///9g/wD/AP8A/wD/AP/F////Sv8A/wD/AP8A/3z///9g/wf/yf/9/0j/AP8A/wD/AP8A/wD/AP98////XP8A/wD/AP8A/wD/AP8A/wD/sP///yj/AP8A/wD/AP9K/7j///+c/2z/Vv8A/wD/AP8A/wD/oP///4D/AP8A/wD/AP8A/wD/AP8A/wD/AP8H/93///+6/0v/Av8A/wD/AP8A/wD/AP8A/wD/AP8A/3z///87//j/ov8A/wD/Av/n/7z/gP///0T/AP8A/wD/AP87////nf8A/wD/AP96////XP8A/wD/AP8A/3z///9g/wD/AP8A/wD/XP///4T/AP8A/wD/AP8w////////////////////c/8A/wD/AP8A/wD/AP8F/+r///+7/wD/AP8A/wD/AP8A/wD/MP///7b/AP8A/wD/AP8A/wD/AP8A/wD/Lv///7b/AP8A/wD/AP/v//f/AP8A/wD/AP8A/2z////p/5j/sv/x////qP8A/wD/AP8A/7D///8q/wD/AP8A/wD/AP8A/wD/sP///yr/AP8A/wD/7P/s/wD/AP8A/wD/Bf/T////iP89/yz/1P///wj/AP8A/wD/AP+w////Kv8A/wD/QP///5j/AP8A/wD/yP///wz/AP8A/wD/AP+w////KP8A/wD/AP8A/wD/7P///xT/AP8A/wD/AP8A/3j///+F/wD/AP8A/wD/fP///2D/n////3T/AP8A/wD/AP8A/wD/AP8A/3z///9c/wD/AP8A/wD/AP8A/wD/AP+w////KP8A/wD/AP8A/wD/hP///1T/AP8A/wD/AP8A/wD/AP/l////Hv8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/F/+f//r////Z/zT/AP8A/wD/AP8A/wD/AP8A/wD/fP///zH/s//w/wb/AP9C////Yv+G////RP8A/wD/AP8A/0v///+P/wD/AP8A/2z///9t/wD/AP8A/wD/fP//////////////////////hP8A/wD/AP8A/x7////T/0T/RP9E/0T/RP8e/wD/AP8A/wD/AP8A/33////p////Sf8A/wD/AP8A/wD/AP8h////zf8A/wD/AP8A/wD/AP8A/wD/AP8Z////zP8A/wD/AP8H//7/5P8A/wD/AP8A/wD/4//+/yr/AP8A/4b///+o/wD/AP8A/wD/sP///yj/AP8A/wD/AP8A/wD/AP+w////KP8A/wD/AP/s/+z/AP8A/wD/AP8y////u/8A/wD/AP/c////CP8A/wD/AP8A/7D///8o/wD/AP9A////mP8A/wD/AP/I////DP8A/wD/AP8A/7D///8o/wD/AP8A/wD/BP////b/AP8A/wD/AP8A/wD/W////5//AP8A/wD/AP98////yP////X/Ev8A/wD/AP8A/wD/AP8A/wD/fP///8L/oP+g/6D/a/8A/wD/AP8A/7D///8o/wD/AP8A/wD/AP+E////VP8A/wD/AP8A/wD/AP8C//z/+v8C/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/Gf+Q//7/5v8B/wD/AP8A/wD/AP8A/wD/AP98////M/9e////TP8A/5n/+P8P/4j///9E/wD/AP8A/wD/S////47/AP8A/wD/a////27/AP8A/wD/AP98////xv+k/6T/pP+k/8X///+E/wD/AP8A/wD/AP/c//X/IP8A/wD/AP8A/wD/AP8A/wD/AP8A/yz/+f/V/yD/8f/j/w//AP8A/wD/AP8A/wH/5//+/zL/AP8A/wL/Bv8A/wD/AP8A/wD/0//9/y3/AP8A/2L///+k/wD/AP8A/wD/Ff///83/AP8A/wD/Mv///6j/AP8A/wD/AP+w////KP8A/wD/AP8A/wD/AP8A/7D///8o/wD/AP8A/+z/7P8A/wD/AP8A/zv///+u/wD/AP8v//3///8I/wD/AP8A/wD/sP///yj/AP8A/0D///+Y/wD/AP8A/8j///8M/wD/AP8A/wD/sP///yj/AP8A/wD/AP8E////9f8A/wD/AP8A/wD/AP9b////nv8A/wD/AP8A/3z//////9P///+i/wD/AP8A/wD/AP8A/wD/AP98//////////////+s/wD/AP8A/wD/sP///yj/AP8A/wD/AP8A/4T///9U/wD/AP8A/wD/AP8A/wX////y/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8F/wH/AP8A/wD/w////xH/AP8A/wD/AP8A/wD/AP8A/3z///80/w//+f+h/wT/7P+u/wD/iP///0T/AP8A/wD/AP87////nP8A/wD/AP96////Xv8A/wD/AP8A/3z///9g/wD/AP8A/wD/XP///4T/AP8A/wD/AP8A/1D//f/s/5X/g/+d/97/BP8A/wD/AP8A/wP/y//+/zv/AP9q////nf8A/wD/AP8A/wD/AP9t////8f+j/6P/4P80/wD/AP8A/wD/AP9J//3/7v+b/6b/+//z/yj/AP8A/wD/AP8s////tv8A/wD/AP8c////qP8A/wD/AP8A/7D///8o/wD/AP8A/wD/AP8A/wD/sP///yj/AP8A/wD/7P/s/wD/AP8A/wD/Df/t//v/jP+I/+z/4////wj/AP8A/wD/AP+w////KP8A/wD/QP///5j/AP8A/wD/yP///wz/AP8A/wD/AP+w////KP8A/wD/AP8A/wD/6////xP/AP8A/wD/AP8A/3j///+F/wD/AP8A/wD/fP///4f/Cv/c////Sv8A/wD/AP8A/wD/AP8A/3z///9c/wD/AP8A/wD/AP8A/wD/AP+w////KP8A/wD/AP8A/wD/hP///1T/AP8A/wD/AP8A/wD/AP/t////Ef8A/wD/AP8A/wD/AP8A/wD/AP8A/zj/4P+W/3f/kv/7/9H/AP8A/wD/AP8A/wD/AP8A/wD/fP///zT/AP+1//D/T////1P/AP+I////RP8A/wD/AP8A/xP////B/wD/AP8A/5////85/wD/AP8A/wD/fP///2D/AP8A/wD/AP9c////hP8A/wD/AP8A/wD/AP9F/8D/9P/3/9//lv8B/wD/AP8A/wD/eP///5j/AP8A/wL/xv///0f/AP8A/wD/AP8A/wD/Zf/T//n/8P+7/xn/AP8A/wD/AP8A/wD/Rf/C//T/8v+1/y//AP8A/wD/AP8A/xb////J/wD/AP8A/y3///+o/wD/AP8A/wD/sP///yj/AP8A/wD/AP8A/wD/AP+w////KP8A/wD/AP/s/+z/AP8A/wD/AP8A/0P/1P/5/93/Yv9p////CP8A/wD/AP8A/7D///8o/wD/AP9A////mP8A/wD/AP/I////DP8A/wD/AP8A/7D///8o/wD/AP8A/wD/AP+x////X/8A/wD/AP8A/wD/xP///0r/AP8A/wD/AP98////YP8A/z///v/j/w7/AP8A/wD/AP8A/wD/fP///1z/AP8A/wD/AP8A/wD/AP8A/7D///8o/wD/AP8A/wD/AP95////Y/8A/wD/AP8A/wD/AP8A/7T///9e/wD/AP8A/wD/AP8A/wD/AP8A/wD/HP+1/+n/+v/m/6T/Hv8A/wD/AP8A/wD/AP8A/wD/AP98////NP8A/2D////f//H/CP8A/4j///9E/wD/AP8A/wD/AP/K//r/IP8A/w//6v/u/wX/AP8A/wD/AP98////YP8A/wD/AP8A/1z///+E/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP/m//v/If8A/wD/d////6j/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/sP///yj/AP8A/wD/AP8A/0f////l/yb/AP8A/wD/b////9r/A/8A/wD/AP8A/3z///9g/wD/AP+V////mf8A/wD/AP8A/wD/AP98////XP8A/wD/AP8A/wD/AP8A/wD/sP///yj/AP8A/wD/AP8A/0X////l/47/lP8A/wD/AP8A/wD/Tv///+X/KP8A/wD/AP8E/wb/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/3z///80/wD/Ef/6////n/8A/wD/iP///0T/AP8A/wD/AP8A/0n//v/k/5j/2P///3b/AP8A/wD/AP8A/3z///9g/wD/AP8A/wD/XP///4T/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/3L////l/5P/qf/o////qP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP+w////KP8A/wD/AP8A/wD/AP+P////+P+5/6b/0////+//NP8A/wD/AP8A/wD/fP///2D/AP8A/wz/4P/+/0H/AP8A/wD/AP8A/3z///9c/wD/AP8A/wD/AP8A/wD/AP+w////KP8A/wD/AP8A/wD/AP+F/+n/9v+1/wD/AP8A/wD/AP8A/5z////6/7v/pv++//L/MP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/fP///zT/AP8A/7b///9F/wD/AP+I////RP8A/wD/AP8A/wD/AP9W/9T/+f/g/3f/Af8A/wD/AP8A/wD/fP///2D/AP8A/wD/AP9c////hP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/Av+D/+j/9/+9/yb/5v+o/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/7D///8o/wD/AP8A/wD/AP8A/wD/Vf+9/+//+v/h/5v/IP8A/wD/AP8A/wD/AP98////YP8A/wD/AP9F////3f8K/wD/AP8A/wD/fP///1z/AP8A/wD/AP8A/wD/AP8A/7D///8o/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/Af9h/8b/8//4/+P/rP8Y/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/7L/7P8o/wD/AP8A/wD/xP///xj/AP8A/wD//P/c/wD/AP8A/wD/0f/+/xz/AP8A/wD/j////2D/AP8A/wD/AP9C/5j/mP+Y/1f/AP8A/wD/AP80/1v/Av8A/wD/AP8A/7b///8n/wD/AP+Y////sf8A/wD/Ev/+/8T/AP8A/wD/AP80///////////////4/wD/AP8A/wD/AP/r/9H/AP/X/+b/AP8A/wD/AP8H//T/9P/0//T/9P/0/93/AP8A/wD/AP8A/wL/BP8A/wD/AP8A/wD/FP8U/wD/AP8A/wj/IP8A/wD/AP8A/wD/AP8A/wD/e////zL/AP8A/wD/AP8A/wD/AP/r/9H/AP8A/wD/AP8G/yD/IP8g/yD/IP8g/yD/Cv8A/wD/AP8A/wD/AP8O/wb/AP8A/wD/AP8C/wD/AP8A/wD/C/99/3//EP8A/wD/AP8A/wD/AP8A/wD/If/w/z//AP8A/wD/AP8A/wD/AP8A/xT/nf/q//j/y/9F/wD/AP8A/wD/AP8E//H/5v8A/wD/AP/Y////cf8A/wD/Uf///4T/AP8A/wD/AP8A/wb/ef/L//D/7v+7/zD/AP8A/wD/AP8A/zD///9j/43/5v/1/8v/Q/8A/wD/AP8A/wD/AP8D/3v/2v/5/+v/s/8J/wD/AP8A/wD/AP8A/wD/4////0v/AP8A/wD/AP/E////GP8A/wD/AP/8/9z/AP8A/wD/AP90////cf8A/wD/Af/j//X/Df8A/wD/AP8A/3D/////////lP8A/wD/AP8A/+T///9L/wD/AP8A/wD/cf///2f/AP8A/97/9v/x/wT/AP9R////f/8A/wD/AP8A/xb/cP9w/3D/mf///87/AP8A/wD/AP8A/9j/vv8A/8P/0/8A/wD/AP8A/wH/IP8g/yD/IP8g/yD/Hf8A/wD/AP8A/wD/y////xv/AP8A/wD/AP+3/9D/Ev8A/wj/uf/Y/wP/AP8A/wD/AP8A/wD/AP9f////GP8A/wD/AP8A/wD/AP8A/9j/vv8A/wD/AP8A/zT///////////////////9U/wD/AP8A/wD/FP+/////+/+1/1v/MP97/17/AP8A/wD/AP8A/1z/+/+e/wD/AP8A/wD/AP8A/wD/AP8k////RP8A/wD/AP8A/wD/AP8A/wb/0P///6L/fP/h//v/LP8A/wD/AP8A/wD/sf///yf/AP8e////9v+2/wD/AP+R////P/8A/wD/AP8A/wD/AP+x/6P/fP+K//T/4/8I/wD/AP8A/wD/MP////j/0f9y/4P/9//y/xb/AP8A/wD/AP8A/53////g/53/sP++/wD/AP8A/wD/AP8A/wD/AP8z/1v/Av8A/wD/AP8A/8T///8Y/wD/AP8A//z/3P8A/wD/AP8A/xr//f/H/wD/AP86////pf8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/rf/r/yf/AP8A/wD/AP8s////p/8A/yX///+X////Ov8A/5L///86/wD/AP8A/wD/AP8A/wD/BP/N//n/Lv8A/wD/AP8A/wD/xf+q/wD/r//A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/Af/0/83/AP8A/wD/AP8A/y3/7P/N/xj/tv/2/0D/AP8A/wD/AP8A/yr/n/9U/1L/+/8f/2b/q/8B/wD/AP8A/wD/xf+q/wD/AP8A/wD/EP9Q/1D/UP9Q/1D/UP9Q/xr/AP8A/wD/AP9A/7r/V/95/9T//////+//NP8A/wD/AP8A/wD/AP9I//D/Wv8A/wD/AP8A/wf/HP8c/zz///9Y/xz/HP8K/wD/AP8A/wD/Xf///57/AP8A/yv///+q/wD/AP8A/wD/AP9s////Z/8A/2X//v+Z//T/Bv8A/9L/9P8G/wD/AP8A/wD/AP8A/wD/AP8A/wD/k////zL/AP8A/wD/AP8w////9P8Q/wD/AP+U////Uf8A/wD/AP8A/yL//v/j/w7/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/xP///xj/AP8A/wD//P/c/wD/AP8A/wD/AP+6////Hv8A/5D///9H/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/5v/m/wD/bP///yf//f9//wD/0//w/wP/AP8A/wD/AP8A/wD/AP+B////eP8A/wD/AP8A/wD/AP+y/5b/AP+b/63/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8q////b/8A/wD/AP8A/wD/AP8x/+7/9f/4/0b/AP8A/wD/AP8A/wD/VP/9///////////////5/xf/AP8A/wD/AP+y/5b/AP8A/wD/AP8G/yD/IP8g/yD/IP8g/yD/Cv8A/wD/AP8A/w3/Av8A/wD/AP8s/0T/Ef8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/QP///////////////////2T/AP8A/wD/AP+d////XP8U/xT/FP/s/9r/AP8A/wD/AP8A/yf///+n/wD/rP/X/0z///8//xT//v+0/wD/AP8A/wD/AP8A/wj/hf/X//X//P/+////R/8A/wD/AP8A/zD///+//wD/AP8A/27///9q/wD/AP8A/wD/Xv///47/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP/E////GP8A/wD/Av/+/9z/AP8A/wD/AP8A/1z///90/wH/4//m/wP/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP+i////Jv+z/9j/AP/N/8P/E//+/6//AP8A/wD/AP8A/wD/AP8z//v/xf8D/wD/AP8A/wD/AP8A/yT/Hv8A/x//I/8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/2P/+P8S/wD/AP8A/wD/AP8A/wT/uf///9H/C/8A/wD/AP8A/wD/AP8A/wL/H//l//v/sf8Q/wD/AP8A/wD/AP8A/yT/Hv8A/wD/AP8A/zT///////////////////9U/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8T/0z/TP9l////e/9M/0z/Hf8A/wD/AP8A/7D/////////////////8/8A/wD/AP8A/wD/AP/i/+b/A//v/5j/EP/8/4P/Uv///2//AP8A/wD/AP8A/wD/mf///7L/Rf8t/5////9I/wD/AP8A/wD/MP///6r/AP8A/wD/bP///2z/AP8A/wD/AP9w////dv8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/8P///8c/wD/AP8Y////3P8A/wD/AP8A/wD/C//z/8j/N////4z/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/13///9f//L/k/8A/4j/+/9W////av8A/wD/AP8A/wD/AP8I/9X/9P8k/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wL/pf/6/37/9P++/wn/AP8A/wD/AP8A/wD/AP+Z//b/Zf///1f/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/D/9M/0z/TP9M/0z/TP9M/xj/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/yT///9E/wD/AP8A/wD/AP8A/wD/nv///3X/RP9E/0T/RP9A/wD/AP8A/wD/AP8A/53///9S////U/8A/8j/xf+M////Kv8A/wD/AP8A/wD/Af/w//T/Bv8A/wD/nP///0j/AP8A/wD/AP8w////qP8A/wD/AP9s////bP8A/wD/AP8A/2H///+N/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/zT/W/8C/wD/AP8A/wD/q////0r/AP8A/27////c/wD/AP8A/wD/AP8A/6L//v+U////Lv8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/Gf///7P///9M/wD/RP///7b///8k/wD/AP8A/wD/AP8A/43///9p/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/mf/8/1X/AP8///X/tv8B/wD/AP8A/wD/AP8r//v/mv8B/9X/4v8I/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/JP///0T/AP8A/wD/AP8A/wD/AP9c////lf8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/WP///7P//P8Q/wD/hP/2/7//5P8A/wD/AP8A/wD/AP8C//j/7P8C/wD/Cv/i////SP8A/wD/AP8A/zD///+o/wD/AP8A/2z///9s/wD/AP8A/wD/Kf///+L/Dv8A/wD/Cf8A/wD/AP8A/wD/AP8A/wD/5P///0v/AP8A/wD/AP9k////6v+R/6j/9v/x/9z/AP8A/wD/AP8A/wD/RP////P/0P8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/9P/+v/5/wz/AP8I//b/+v/f/wD/AP8A/wD/AP8A/zv//f/t/3D/cP9w/3D/Cv8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP9V/1v/AP8A/wD/Qf9v/wD/AP8A/wD/AP8A/wD/J/8h/wD/NP8U/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8k////RP8A/wD/AP8A/wD/AP8A/wX/yP///7z/hf+O/7n/fP8A/wD/AP8A/wD/AP8V//7/+v/F/wD/AP8/////+v+f/wD/AP8A/wD/AP8A/wD/u////6r/fv/U/+L///9I/wD/AP8A/wD/MP///6j/AP8A/wD/bP///2z/AP8A/wD/AP8A/63////f/5v/rP/l/wD/AP8A/wD/AP8A/wD/AP+t/+v/J/8A/wD/AP8A/wP/gv/g//j/z/9I/7D/3P8A/wD/AP8A/wD/AP8C/+T///9y/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/jv///7//AP8A/wD/uv///5r/AP8A/wD/AP8A/wD/eP////////////////8Y/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8N/47/4f/7/+7/wf9B/wD/AP8A/wD/AP8A/wD/zv///3//AP8A/wb/9P///1r/AP8A/wD/AP8A/wD/AP8h/7z/9f/q/47/Lv///0j/AP8A/wD/AP8w////qP8A/wD/AP9s////bP8A/wD/AP8A/wD/CP+K/+L/+//p/53/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP/K/+r/BP8A/wD/AP8A/3z/////////9v/Z/5H/Hf8A/wD/AP8A/wD/AP+w////JP8A/wD/AP8A/wD/AP8A/wD/AP8A/3z/////////9P/J/2H/AP8A/wD/AP8A/wD/AP8E/3r/2v/3/+D/jv8O/wD/AP8A/wD/AP8A/wD/LP/e////GP8A/wD/AP8A/3z///////////////j/AP8A/wD/AP8A/xr/lP/h//j/2f92/wT/AP8A/wD/AP8A/3z///9g/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP9a/9f/+P/o/0z/AP8A/wD/AP8A/0r/tf/t//f/2v+B/wj/AP8A/wD/AP8A/2z///////////////////98/wD/AP8A/wD/AP8A/wL/Y//E//D/+/+Y/wD/AP8A/wD/AP8A/wX/dP/W//b/5/+8/1//AP8A/wD/AP8A/wD/AP8A/wD/Av/I////UP8A/wD/AP8A/wD/sP///yj/AP8A/wD/AP8A/wD/AP8A/wD/AP98////YP8A/wD/AP8A/wD/AP8A/yf/mf/c//f/8P/S/4z/Ff8A/wD/AP8A/8T////////////////////Q/wD/AP8A/wD/fP////X/H/8A/wD/AP8A/7D///8I/wD/AP8A/wD/1v///0X/AP8A/wD/AP8A/wD/AP8l////k/8A/wD/AP8A/wD/fP///7//mP+i/9X////v/z3/AP8A/wD/AP8A/7D///8k/wD/AP8A/wD/AP8A/wD/AP8A/wD/fP///7//mf+1//r///9z/wD/AP8A/wD/AP8A/43////B/33/tP///6z/AP8A/wD/AP8A/wD/TP/y//////8Y/wD/AP8A/wD/fP///8H/nP+c/5z/l/8A/wD/AP8A/w7/6P///83/p//j////hf8A/wD/AP8A/wD/fP///2D/AP8A/wD/AP8A/wD/AP8A/wD/AP8b//v/8v+U/6D/Gv8A/wD/AP8A/xf/8v/v/7H/nv/f////nP8A/wD/AP8A/wD/Rv+o/6j/qP+o/6j/2f///2L/AP8A/wD/AP8A/wH/qP///+P/nP+S/3P/AP8A/wD/AP8A/wD/mv///+L/rP/B//b/of8A/wD/AP8A/wD/AP8A/wD/AP9v//////9Q/wD/AP8A/wD/AP+w////KP8A/wD/AP8A/wD/AP8A/wD/AP8A/3z///9g/wD/AP8A/wD/AP8A/1f/+P///9z/rP+3/+L/7f8J/wD/AP8A/wD/ff+k/6T/yf///83/pP+k/4X/AP8A/wD/AP98//////+v/wD/AP8A/wD/sP///wj/AP8A/wD/AP/J////Of8A/wD/AP8A/wD/AP8A/4D///84/wD/AP8A/wD/AP98////YP8A/wD/AP9h//7/6f8N/wD/AP8A/wD/sP///yT/AP8A/wD/AP8A/wD/AP8A/wD/AP98////YP8A/wD/O////+n/AP8A/wD/AP8A/wD/4v/n/wX/AP8A/83/+v8G/wD/AP8A/wD/av/9/8f/w////xj/AP8A/wD/AP98////YP8A/wD/AP8A/wD/AP8A/wD/AP9k/z//AP8A/xT/8//q/wD/AP8A/wD/AP98////YP8A/wD/AP8A/wD/AP8A/wD/AP8A/0b///+U/wD/AP8A/wD/AP8A/wD/AP83/wz/AP8A/xD/9P/x/wD/AP8A/wD/AP8A/wD/AP8A/wD/Af/Y//D/C/8A/wD/AP8A/wD/YP///6z/B/8A/wD/AP8A/wD/AP8A/wD/Bf/5/+n/DP8A/wD/DP8Y/wD/AP8A/wD/AP8A/wD/AP8f//T/z////1D/AP8A/wD/AP8A/7D///8n/wD/AP8A/wD/AP8A/wD/AP8A/wD/fP///2D/AP8A/wD/AP8A/yv/+P/7/2P/AP8A/wD/AP8d/wD/AP8A/wD/AP8A/wD/AP9o////dP8A/wD/AP8A/wD/AP8A/3z////h////Sv8A/wD/AP+w////CP8A/wD/AP8A/7z///8t/wD/AP8A/wD/AP8A/wD/2v/d/wD/AP8A/wD/AP8A/3z///9g/wD/AP8A/wD/pP///2z/AP8A/wD/AP+w////JP8A/wT/s////2j/AP8A/wD/AP8A/3z///9g/wD/AP8A/+T///8N/wD/AP8A/wD/AP/X/+//Cv8A/wH/1P/x/wH/AP8A/wD/AP9D/6n/Cf+5////GP8A/wD/AP8A/3z///9g/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP/Z////BP8A/wD/AP8A/3z///9g/wD/AP8A/wD/AP8A/wD/AP8A/23/6f////////+o/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP/s/+b/AP8A/wD/AP8A/wD/AP8A/wD/AP9K////kP8A/wD/AP8A/wD/AP/L//b/Ef8A/wD/AP8A/wD/AP8A/wD/AP8H//7/3P8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/7j/2/93////UP8A/wD/AP8A/wD/sP///0r/wP/3/+X/ev8A/wD/AP8A/wD/AP98////YP8A/wD/AP8A/wD/oP///4X/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/2j///90/wD/AP8A/wD/AP8A/wD/fP///2D////c/wj/AP8A/7D///8I/wD/AP8A/wD/r////yD/AP8A/wD/AP8A/wD/Nv///4P/AP8A/wD/AP8A/wD/fP///2D/AP8A/wD/AP9S////qv8A/wD/AP8A/7D///8k/wD/nv///4D/AP8A/wD/AP8A/wD/fP///2D/AP8A/wb/9v/5/wT/AP8A/wD/AP8A/2P///++/zr/pP///2//AP8A/wD/AP8A/wD/AP8A/7z///8Y/wD/AP8A/wD/fP///2D/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8X//v/0/8A/wD/AP8A/wD/fP///2D/AP8A/wD/AP8A/wD/AP8A/wD/Tf+X////vP9s/0b/AP8A/wD/AP8A/wD/AP8A/wT/IP+V////bf8A/wD/AP8A/wD/AP8A/wD/AP8A/7r//v8l/wD/AP8A/wD/AP8M//7/uP8A/w7/Ff8A/wD/AP8A/wD/AP8A/wD/w////5b/D/8A/wD/AP8A/wD/AP8A/wD/AP8A/13///9D/3b///9Q/wD/AP8A/wD/AP+w////7/+w/5j/6v///2b/AP8A/wD/AP8A/3z///9g/wD/AP8A/wD/AP/l////HP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/aP///3T/AP8A/wD/AP8A/wD/AP98////LP+r////f/8A/wD/sP///wj/AP8A/wD/AP+j////FP8A/wD/AP8A/wD/AP+R////Kf8A/wD/AP8A/wD/AP98////YP8A/wD/AP8A/zP////E/wD/AP8A/wD/sP///yL/hf///5n/AP8A/wD/AP8A/wD/AP98////YP8F/yb/pv///7D/AP8A/wD/AP8A/wD/AP9w/////////2r/AP8A/wD/AP8A/wD/AP8A/wD/vP///xj/AP8A/wD/AP98//////////////+w/wD/AP8A/wD/AP8A/wD/AP8A/6L///9h/wD/AP8A/wD/AP98////YP8A/wD/AP8A/wD/AP8A/wD/AP8A/0z///+M/wD/AP8A/wD/AP8A/wD/AP8A/5T//////+3/W/8A/wD/AP8A/wD/AP8A/wD/AP8A/yr///+4/wD/AP8A/wD/AP8A/zH///+a/6j//f///+H/R/8A/wD/AP8A/wD/AP8m/9/////z/47/F/8A/wD/AP8A/wD/AP8A/xX/7P+e/wD/eP///1D/AP8A/wD/AP8A/7D///+K/wD/AP8s//7/2/8A/wD/AP8A/wD/fP///2D/AP8A/wD/AP8D//7/8f8A/wD/AP+F/6T/pP+k/0D/AP8A/wD/AP8A/wD/AP9o////dP8A/wD/AP8A/wD/AP8A/3z///8y/x7/9v/3/yL/AP+w////CP8A/wD/AP8A/5b///8I/wD/AP8A/wD/AP8D/+j/zv8A/wD/AP8A/wD/AP8A/3z///9g/wD/AP8A/wD/Nf///8D/AP8A/wD/AP+w////bf///7P/A/8A/wD/AP8A/wD/AP8A/3z//////////////9b/HP8A/wD/AP8A/wD/AP85/+f/7/+n//j/7P9F/wD/AP8A/wD/AP8A/wD/AP+8////GP8A/wD/AP8A/3z///+//5j/mP+Y/2j/AP8A/wD/AP8A/wD/AP8A/2////+v/wH/AP8A/wD/AP8A/3z///9g/wD/AP8A/wD/AP8A/wD/AP8A/wD/TP///4z/AP8A/wD/AP8A/wD/AP8A/wD/Tv+L/6H/5//9/33/AP8A/wD/AP8A/wD/AP8A/wD/mv///0z/AP8A/wD/AP8A/wD/P/////f/uf9l/3v/8//z/xr/AP8A/wD/AP8A/wD/Cv94/+j////u/zv/AP8A/wD/AP8A/wD/p//o/xH/AP94////UP8A/wD/AP8A/wD/sP///z7/AP8A/wD/1v///wr/AP8A/wD/AP98////YP8A/wD/AP8A/wT////u/wD/AP8A/9D/////////ZP8A/wD/AP8A/wD/AP8A/2j///90/wD/AP8A/wD/AP8A/wD/fP///zT/AP9+////tP8A/67///8I/wD/AP8A/wD/if/7/wD/AP8A/wD/AP8A/0f///9z/wD/AP8A/wD/AP8A/wD/fP///2D/AP8A/wD/AP9Z////o/8A/wD/AP8A/7D////3////zv8G/wD/AP8A/wD/AP8A/wD/fP///8H/mv+K/1P/Bv8A/wD/AP8A/wD/AP8K/+r/5P8e/wD/Jv/g//b/HP8A/wD/AP8A/wD/AP8A/7z///8Y/wD/AP8A/wD/fP///2D/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/1v//v/C/wr/AP8A/wD/AP8A/wD/fP///2D/AP8A/wD/AP8A/wD/AP8A/wD/AP9M////jP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8L/9f///8r/wD/AP8A/wD/AP8A/wD/Ev/2/97/Av8A/wD/AP8A/wD/AP83////wf8B/wD/AP96////Yf8A/wD/AP8A/wD/AP8A/wD/CP+F////2/8A/wD/AP8A/wD/S////1b/AP8A/3j///9Q/wD/AP8A/wD/AP+w////LP8A/wD/AP/C////IP8A/wD/AP8A/3z///9g/wD/AP8A/wD/AP/r//7/Ef8A/wD/AP8A/3T///9k/wD/AP8A/wD/AP8A/wD/aP///3T/AP8A/wD/AP8A/wD/AP98////NP8A/wj/3////07/qP///wj/AP8A/wD/AP98/+//AP8A/wD/AP8A/wD/ov/9/xv/AP8A/wD/AP8A/wD/AP98////YP8A/wD/AP8A/7T///9g/wD/AP8A/wD/sP///5z/jv///47/AP8A/wD/AP8A/wD/AP98////YP8A/wD/AP8A/wD/AP8A/wD/AP8A/0H///+D/wD/AP8A/2T///9l/wD/AP8A/wD/AP8A/wD/vP///xj/AP8A/wD/AP98////YP8A/wD/AP8A/wD/AP8A/wD/AP8A/1H/+//G/w3/AP8A/wD/AP8A/wD/AP98////YP8A/wD/AP8A/wD/AP8A/wD/AP8A/0z///+M/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/of///1T/AP8A/wD/AP8A/wD/AP95////df8A/wD/AP8A/wD/AP8A/xj///+r/wD/AP8A/1r///94/wD/AP8A/wD/AP8A/wD/AP8A/wD/0////xD/AP8A/wD/AP+v////////////////////3P8A/wD/AP8A/7D///9A/wD/AP8A/9j///8J/wD/AP8A/wD/fP///2D/AP8A/wD/AP8A/67///9k/wD/AP8A/wD/dP///2T/AP8A/wD/AP8A/wD/AP9o////dP8A/wD/AP8A/wD/AP8A/3z///80/wD/AP9S////3/+n////CP8A/wD/AP8A/xD/IP8A/wD/AP8A/wD/Cf/z/77/AP8A/wD/AP8A/wD/AP8A/3z///9g/wD/AP8E/33////f/wf/AP8A/wD/AP+w////JP8G/9D//v9H/wD/AP8A/wD/AP8A/3z///9g/wD/AP8A/wD/AP8A/wD/AP8A/wD/Pf///6P/AP8A/wD/gv///1v/AP8A/wD/AP8A/wD/AP+8////GP8A/wD/AP8A/3z///9g/wD/AP8A/wD/AP8A/wD/AP8A/0n/+f/I/w7/AP8A/wD/AP8A/wD/AP8A/3z///9g/wD/AP8A/wD/AP8A/wD/AP8A/wD/TP///4z/AP8A/wD/AP8A/wD/AP8V/wz/AP8A/wD/C//d////M/8A/wD/AP8A/wD/AP8E/+P/9v8S/wD/AP8A/wD/AP8A/wD/AP/N//L/Hv8A/wD/n////1L/AP8A/wD/AP8V/yn/AP8A/wD/D//q//X/BP8A/wD/AP8A/2P/kP+Q/5D/kP/E////s/97/wD/AP8A/wD/sP///5L/AP8A/y/////X/wD/AP8A/wD/AP98////YP8A/wD/AP8A/wD/Q////+z/NP8A/wD/AP90////ZP8A/wD/AP8A/wD/AP8A/2j///90/wD/AP8A/wD/AP8A/wD/fP///zT/AP8A/wD/u/////f///8I/wD/AP8A/wD/M/9b/wL/AP8A/wD/AP9Y////Y/8A/wD/AP8A/wD/AP8A/wD/fP///8H/nP+s/+X////n/zD/AP8A/wD/AP8A/7D///8k/wD/K//3/+j/Fv8A/wD/AP8A/wD/fP///2D/AP8A/wD/AP8A/wD/AP8A/wD/AP8F/9f///+q/3j/nf/7/+L/Dv8A/wD/AP8A/wD/AP8A/7z///8Y/wD/AP8A/wD/fP///8T/oP+g/6D/m/8A/wD/AP8A/yv/9////77/sP+w/7D/sP9P/wD/AP8A/wD/fP///8b/pP+k/6T/pP8j/wD/AP8A/wD/AP9M////jP8A/wD/AP8A/wD/AP8A/1T/9P+z/5L/m//j////s/8A/wD/AP8A/wD/AP8A/1n///+d/wD/AP8A/wD/AP8A/wD/AP8A/0P/+//p/5v/uv///9X/Bv8A/wD/AP8A/zj////X/6//p//m////hv8A/wD/AP8A/wD/AP8A/wD/AP8A/3j///9Q/wD/AP8A/wD/AP+w////8/+0/5j/6v///2D/AP8A/wD/AP8A/3z///9g/wD/AP8A/wD/AP8A/4f////9/8H/ov+4/+f///9k/wD/AP8A/wD/AP8A/wD/aP///3T/AP8A/wD/AP8A/wD/AP98////NP8A/wD/AP8q//v//////wj/AP8A/wD/AP/k////S/8A/wD/AP8A/7P/+P8Q/wD/AP8A/wD/AP8A/wD/AP98//////////L/zf+C/xT/AP8A/wD/AP8A/wD/sP///yT/AP8A/27///+2/wH/AP8A/wD/AP98////YP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/GP+U/97/9//h/53/HP8A/wD/AP8A/wD/AP8A/wD/vP///xj/AP8A/wD/AP98///////////////4/wD/AP8A/wD/TP///////////////////3T/AP8A/wD/AP98/////////////////zj/AP8A/wD/AP8A/0z///+M/wD/AP8A/wD/AP8A/wD/JP+l/+D/9//t/8v/a/8G/wD/AP8A/wD/AP8A/wD/yP///zH/AP8A/wD/AP8A/wD/AP8A/wD/AP9G/8f/9f/h/5r/Ev8A/wD/AP8A/wD/F/+g/97/9f/v/8n/Xv8B/wD/AP8A/wD/AP8A/wD/AP8A/wD/eP///1D/AP8A/wD/AP8A/7D/1P8z/8b/+P/k/3b/AP8A/wD/AP8A/wD/fP///2D/AP8A/wD/AP8A/wD/AP9P/7r/7v/7/+z/0v+Y/yr/AP8A/wD/AP8A/wD/AP9o////dP8A/wD/AP8A/wD/AP8A/3z///80/wD/AP8A/wD/j///////CP8A/wD/AP8A/67/7P8n/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/xT/nP/k//7/////////nP8A/wD/AP8A/8////8s/wD/AP8A/5P///9l/wD/AP8A/wD/sP/o/zb/x//4/+X/ev8A/wD/AP8A/wD/AP8A/wD/AP8C/+P///98/wD/AP8A/wD/AP8A/wD/AP/W//3/Fv8A/wD/AP8A/yX////I/wD/AP8A/wD/fP/////////z/8n/Zf8A/wD/AP8A/wD/AP8A/7D///8o/wD/AP8A/wD/AP8A/wD/AP8A/wH/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/1r/1//5//r/W//F/9b/A/8A/wD/AP8A/5j///9I/wD/AP8A/wD/aP///3j/AP8A/wD/AP8A/wD/Wv/X//n/+v9b/wD/f//i//v/+f89/+T/q/8A/wD/AP8A/77///9I/wD/AP8A/wH/0P///zb/AP8A/wD/AP8A/0v/3P/r/4P/AP8A/wD/Df/q/4v/AP8A/wD/AP8A/wD/AP98//////////n/4f+j/yX/AP8A/wD/AP8A/8n///8d/wD/AP8A/4b///+a/wD/AP8A/wT/9f/n/wD/AP8A/wD/AP8A/wD/AP81////M/8A/9X/h/8A/wD/AP8A/wD/AP9y//////////////+I/wD/AP8A/wD/AP9w////Ff+D/+z/x/8A/wD/AP8A/wD/uv/7/2n/Q//J////i/8n/wD/AP8A/wD/bf///4T/AP8A/wH/5f/4/xD/AP8A/wD/AP+w////7f+I/3H/1////2b/AP8A/wD/AP8A/wD/AP8A/0H////5/9f/AP8A/wD/AP8A/wD/AP8A/4H///9m/wD/AP8A/wD/d////3P/AP8A/wD/AP98////wf+e/7n/+////3n/AP8A/wD/AP8A/wD/sP///yj/AP8A/wD/AP8A/wD/AP8A/wD/P/+x/y//AP8A/wD/AP8A/wD/AP8A/wD/AP8A/xv/+//y/5T/nv8W/9b/5v8F/wD/AP8A/wD/mP///0j/AP8A/wD/AP9o////eP8A/wD/AP8A/wD/G//7//L/lP+e/xb/S////+H/j/+X/xT/8v+8/wD/AP8A/wD/O////8n/AP8A/wD/U////7H/AP8A/wD/AP8A/wn/7v+6/4P///9H/wD/AP9///H/E/8A/wD/AP8A/wD/AP8A/3z///+//5j/o//Z////6f8O/wD/AP8A/wD/if///1n/AP8A/wD/yv///9//AP8A/wD/Nv///6j/AP8A/wD/AP8A/wD/AP8A/13//v8L/wP/+f9e/wD/AP8A/wD/AP8A/4X///+7/6z/rP+s/1v/AP8A/wD/AP8A/3D///+3//v/zv+T/wD/AP8A/wD/EP///7T/AP8A/0T///+B/wD/AP8A/wD/AP8S//j/3P8A/wD/O////6z/AP8A/wD/AP8A/7D///9z/wD/AP8f//z/2/8A/wD/AP8A/wD/AP8A/wD/nf/8/5D///8y/wD/AP8A/wD/AP8A/wD/LP///7j/AP8A/wD/AP/J////H/8A/wD/AP8A/3z///9g/wD/AP85////6v8A/wD/AP8A/wD/AP+w////J/8A/wD/AP8A/wD/AP8A/wD/AP8i/9b//v+r/yv/AP8A/wD/AP8A/wD/AP8A/wD/Rv///5T/AP8A/wD/BP8F/wD/AP8A/wD/AP+Y////SP8A/wD/AP8A/2j///94/wD/AP8A/wD/AP9G////lP8A/wD/AP96////YP8A/wD/AP8H/wL/AP8A/wD/AP8A/7j///9M/wD/Af/S//7/Lv8A/wD/AP8A/wD/PP///0f/AP/r/5T/AP8T//H/ff8A/wD/AP8A/wD/AP8A/wD/fP///2D/AP8A/wP/yf///03/AP8A/wD/AP9J////lf8A/wD/EP/8/+n///8k/wD/AP9x////aP8A/wD/AP8A/wD/AP8A/wD/hv/h/wD/Jv///zX/AP8A/wD/AP8A/wD/mf///yH/AP8A/wD/AP8A/wD/AP8A/wD/cP////P/M/8A/wD/AP8A/wD/AP8g////qP8A/wD/OP///4n/AP8A/wD/AP8A/wD/qP///zX/AP+P////T/8A/wD/AP8A/wD/sP///zf/AP8A/wD/0v///wr/AP8A/wD/AP8A/wD/B//w/8f/MP///43/AP8A/wD/AP8A/wD/AP8A/9f/+v8Q/wD/AP8b//7/yP8A/wD/AP8A/wD/fP///2D/AP8A/wD/5f///w3/AP8A/wD/AP8A/7D///9E/7z/9v/k/5P/Cv8A/wD/AP8A/wD/Af9T/83//f+l/yb/AP8A/wD/AP8A/wD/bf/p/////////6j/AP/g//T/AP8A/wD/AP8A/5j///9I/wD/AP8A/wD/aP///3j/AP8A/wD/AP9t/+n/////////qP+V//X/////////dP8Q////xP8A/wD/AP8A/wD/Nf///83/AP9X////qP8A/wD/AP8A/wD/AP9R////M/8A/9T/rP8A/43/6v8M/wD/AP8A/wD/AP8A/wD/AP98////YP8A/wD/AP+i////S/8A/wD/AP8A/wz/+//R/wD/AP9S////iv///2r/AP8A/63///8o/wD/AP8A/wD/AP8A/xT/FP+z/7//FP9b////If8T/wD/AP8A/wD/AP+s////DP8A/wD/AP8A/wD/AP8A/wD/AP9w////kP8A/wD/AP8A/wD/AP8A/wH/2v/w/zP/Dv+i////Q/8A/wD/AP8A/wD/AP9F////jf8B/+L/7P8F/wD/AP8A/wD/AP+w////LP8A/wD/AP/C////IP8A/wD/AP8A/wD/AP9T////d/8A/9z/5v8C/wD/AP8A/wD/AP8A/wD/gv///1z/AP8A/2z///9z/wD/AP8A/wD/AP98////YP8A/wD/Bf/0//b/Af8A/wD/AP8A/wD/sP///+v/vP+T/97///+H/wD/AP8A/wD/AP8A/wD/AP9I/8P//P+g/xv/AP8A/wD/AP9N/5f///+8/2z/Rv8A/+D/9P8A/wD/AP8A/wD/mP///0j/AP8A/wD/AP9o////eP8A/wD/AP8A/03/l////7z/bP9G/2P/tv///57/bP8w/xD////E/wD/AP8A/wD/AP8A/7L///9S/9b//P8n/wD/AP8A/wD/AP8A/0D///8+/wD/4v+c/xz/9/9v/wD/BP8A/wD/AP8A/wD/AP8A/3z///9g/wD/CP9A/+7/6v8N/wD/AP8A/wD/AP/J//3/D/8A/5b///8g//j/r/8A/wD/5//o/wD/AP8A/wD/AP8A/wj///////////////////////T/AP8A/wD/AP8A/8D//P94/4n/a/8h/wD/AP8A/wD/AP8A/3D///9q/wD/AP8A/wD/AP8A/wD/AP8u/+z///////L/cP8A/wD/AP8A/wD/AP8A/wH/4P/d/zb///+W/wD/AP8A/wD/AP8A/7D///9C/wD/AP8A/9v///8J/wD/AP8A/wD/AP8A/6////8j/wD/h////0P/AP8A/wD/AP8A/wD/AP8t////rv8A/wD/vv///x//AP8A/wD/AP8A/3z///9g/wH/HP+b////nP8A/wD/AP8A/wD/AP+w////m/8A/wD/If///9H/AP8A/wD/AP8A/wD/AP8A/wX/Wf/k////WP8A/wD/AP8A/wD/TP///4z/AP8A/wD/4P/0/wD/AP8A/wD/AP+Y////SP8A/wD/AP8A/2j///94/wD/AP8A/wD/AP9M////jP8A/wD/AP+A////WP8A/wD/EP///8T/AP8A/wD/AP8A/wD/L//+//L///+f/wD/AP8A/wD/AP8A/wD/Ef/2/5D/RP///2f/m//h/x7/wv/6/9T/Kv8A/wD/AP8A/wD/fP//////////////zv8n/wD/AP8A/wD/AP8A/4j///9J/wD/2v/V/wD/v//w/wP/JP///6n/AP8A/wD/AP8A/wD/Av9E/1H///99/0T/z/+7/0T/QP8A/wD/AP8A/wD/xf////////////f/YP8A/wD/AP8A/wD/cP///2j/AP8A/wD/AP8A/wD/AP8A/3v/7P8z/yL/BP8A/wD/AP8A/wD/AP8A/wD/AP+A////nP///zn/AP8A/wD/AP8A/wD/sP///5X/AP8A/zf////X/wD/AP8A/wD/AP8A/xD/+f/O/wD/AP8y////nv8A/wD/AP8A/wD/AP8A/wD/2P/1/wr/E//8/8j/AP8A/wD/AP8A/wD/fP//////////////r/8K/wD/AP8A/wD/AP8A/7D///9D/wD/AP8A//D/6v8A/wD/AP8A/wD/AP8a/4H/5//7/6b/M/8A/wD/AP8A/wD/AP9M////jP8A/wD/AP/g//T/AP8A/wD/AP8A/5j///9I/wD/AP8A/wD/aP///3j/AP8A/wD/AP8A/0z///+M/wD/AP8A/4D///9Y/wD/AP8Q////xP8A/wD/AP8A/wD/AP8A/6v////6/yH/AP8A/wD/AP8A/wD/AP8A/3L//////8f/MP/7/2H/kf/i/wz/tf/C/wD/AP8A/wD/AP98////t/+M/5P/wP///8r/E/8A/wD/AP8A/wD/Sf///4X/Hf///5H/AP95////Of9f////af8A/wD/AP8A/wD/AP8M/xT/Wv/+/yf/GP/0/3b/FP8I/wD/AP8A/wD/AP8P/yf/B/8V/2r//f/2/xL/AP8A/wD/AP9w////aP8A/wD/AP8A/wD/AP8A/wD/of/5/6X/mP+V/3r/IP8A/wD/AP8A/wD/AP8A/x///v/7/9z/AP8A/wD/AP8A/wD/AP+w////9f+0/5n/7f///2D/AP8A/wD/AP8A/wD/Zf/////////////////x/wj/AP8A/wD/AP8A/wD/AP+D////Uv9h////c/8A/wD/AP8A/wD/AP98////vP+U/9r/+v8p/wD/AP8A/wD/AP8A/wD/sP///yz/AP8A/wD/7P/s/wD/AP8A/wD/Gf+p//v/8f+M/x3/AP8A/wD/AP8A/wD/AP8A/0z///+M/wD/AP8A/+D/9P8A/wD/AP8A/wD/lv///0z/AP8A/wD/AP9s////dv8A/wD/AP8A/wD/TP///4z/AP8A/wD/gP///1j/AP8A/xD////E/wD/AP8A/wD/AP8A/wD/Pv///7P/AP8A/wD/AP8A/wD/AP8A/wD/AP8a/yz/A/+p/9f/A//P/6z/AP9u////CP8A/wD/AP8A/3z///9g/wD/AP8A/4r///+C/wD/AP8A/wD/AP8N//z/vf9d////Tf8A/zT///96/5n///8q/wD/AP8A/wD/AP8A/6D//////////////////////2j/AP8A/wD/AP8A/wD/AP8A/wD/AP+w////SP8A/wD/AP8A/3D///9o/wD/AP8A/wD/AP8A/wD/Af9z//7////////////0/yT/AP8A/wD/AP8A/wD/AP+7////gP8A/wD/AP8A/wD/AP8A/7D///9O/8b/+P/j/3X/AP8A/wD/AP8A/wD/AP/B////p/+k/6T/pP/Q////VP8A/wD/AP8A/wD/AP8A/y7///+d/6z///8f/wD/AP8A/wD/AP8A/3z///9g/wD/OP/+/8f/Av8A/wD/AP8A/wD/AP+w////KP8A/wD/AP/s/+z/AP8A/wD/AP9A/+H/c/8O/wD/AP8A/wD/AP8A/wD/AP8A/wD/TP///4z/AP8A/wD/4P/0/wD/AP8A/wD/AP+E////av8A/wD/AP8A/47///9f/wD/AP8A/wD/AP9M////jP8A/wD/AP+A////WP8A/wD/EP///8T/AP8A/wD/AP8A/wD/AP80////rP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8x//7/U/8A/+H/o/8A/2T///8c/wD/AP8A/wD/fP///2D/AP8A/wD/T////6v/AP8A/wD/AP8A/wD/yv/w/5P/+/8N/wD/Av/s/7D/0f/p/wD/AP8A/wD/AP8A/wD/Kv9E/83/v/9E/5D/+/9F/0T/G/8A/wD/AP8A/wD/AP8A/wD/AP8A/6D///9I/wD/AP8A/wD/cP///2j/AP8A/wD/AP8A/wD/AP+C//z/T/8F/wD/Cv91////c/8A/wD/AP8A/wD/AP8A/7b///8k/wD/AP8A/wD/AP8A/wD/sP///yf/AP8A/wD/AP8A/wD/AP8A/wD/AP8d//7/zv8A/wD/AP8A/0H///+v/wD/AP8A/wD/AP8A/wD/AP/Z/9z/5f/I/wD/AP8A/wD/AP8A/wD/fP///2D/AP8A/5j///9x/wD/AP8A/wD/AP8A/7D///8o/wD/AP8A/+z/7P8A/wD/AP8A/wv/BP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP9M////jP8A/wD/AP/g//T/AP8A/wD/AP8A/0H////T/w//AP8A/x7/7P/8/xv/AP8A/wD/AP8A/0z///+M/wD/AP8A/4D///9Y/wD/AP8Q////xP8A/wD/AP8A/wD/AP8A/zT///+s/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/7f/zP8B/wD/y/+4/wD/fv///wj/AP8A/wD/AP98////YP8A/wD/AP+Y////kf8A/wD/AP8A/wD/AP+L////2f/F/wD/AP8A/6n/4P/4/6r/AP8A/wD/AP8A/wD/AP8A/wD/3v+C/wD/jf/W/wD/AP8A/wD/AP8A/wD/Bv8e/wD/AP8A/xX/6P/7/xb/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/8T/4v8A/wD/AP8A/1D///9q/wD/AP8A/wD/AP8A/y7//f+8/wD/AP8A/wD/AP8A/wD/AP+w////KP8A/wD/AP8A/wD/AP8A/wD/AP8A/3f///94/wD/AP8A/wD/Av/n//n/Ef8A/wD/AP8A/wD/AP8A/4T//////3P/AP8A/wD/AP8A/wD/AP98////YP8A/wD/EP/p//X/I/8A/wD/AP8A/wD/sP///yj/AP8A/wD/7P/s/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/0z///+M/wD/AP8A/+D/9P8A/wD/AP8A/wD/AP+v////6v+w/7X/8////33/AP8A/wD/AP8A/wD/TP///4z/AP8A/wD/gP///1j/AP8A/xD////E/wD/AP8A/wD/AP8A/wD/NP///6z/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/z3///9F/wD/AP+D//b/Zf/e/8L/AP8A/wD/AP8A/3z////B/5z/of/O////9P8o/wD/AP8A/wD/AP8A/0v//////4H/AP8A/wD/ZP//////a/8A/wD/AP8A/wD/AP8A/wD/Cf/9/1f/AP+4/6v/AP8A/wD/AP8A/wD/AP8U//3/w/+d/6T/7P///4f/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/if///5z/Vf9Z/4b/7//i/xP/AP8A/wD/AP9j/5T/6//5/zf/AP8A/wD/AP8A/wD/AP8A/7D///8o/wD/AP8A/wD/AP8A/wD/AP8A/wD/0v///yP/AP8A/wD/AP8A/5P///9m/wD/AP8A/wD/AP8A/wD/L///////H/8A/wD/AP8A/wD/AP8A/3z///9g/wD/AP8A/1v///++/wH/AP8A/wD/AP+w////KP8A/wD/AP/s/+z/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/TP///4z/AP8A/wD/4P/0/wD/AP8A/wD/AP8A/wX/eP/V//n/8f/D/1b/AP8A/wD/AP8A/wD/AP9M////jP8A/wD/AP+A////WP8A/wD/EP///8T/AP8A/wD/AP8A/wD/AP80////rP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/xP+//wD/AP8A/w3/rP/y/8r/Kf8A/wD/AP8A/wD/fP/////////9/+P/qv8q/wD/AP8A/wD/AP8A/wD/D//8////Pf8A/wD/AP8f//////8r/wD/AP8A/wD/AP8A/wD/AP8w////Lf8A/+P/gf8A/wD/AP8A/wD/AP8A/wf/lv/d//b/9v/L/2P/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8G/4X/2//3//f/2P+P/xf/AP8A/wD/AP8A/5b/9//Q/0j/AP8A/wD/AP8A/wD/AP8A/wD/sP///yj/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8//6X/3P/3/+f/uP9T/wD/AP8A/wD/AP8A/wD/AP8G/4b/4//4/9L/Xf8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/Af8A/wD/AP8A/wD/AP9a/9f/+P/o/0z/AP9//+L/+f/f/yf/AP8A/wD/AP8A/wD/e//k//f/v/8r//D/qP8A/wD/AP8A/wD/AP9a/9f/+P/o/0z/4P/0/wD/AP8A/wD/AP8A/1r/1//4/+j/TP8A/3//4v/5/9//N////8T/AP8A/wD/AP9q////pv8A/wD/AP8A/6f///9Y/wD/AP8A/wD/VP///////////////////4j/AP8A/wD/AP+z//j/EP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP/0/xj/AP8A/wD/AP8A/wD/AP/w/+T/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/xb/lf/f//f/4P+p/z3/AP8A/wD/AP8A/xL/mP/m//r/2/93/wL/AP8A/wD/AP8A/wD/L/+4//P/8/+y/yT/AP8A/wD/AP8A/xj////I/wD/AP8A/wD/AP/o//j/AP8A/wD/AP8b/6X/5//4/9//nv8R/wD/AP8A/wD/AP8A/3f/1P8A/wD/AP8A/wD/AP8A/wD/A/99/97/+v/d/3D/AP8A/wD/AP8A/wD/AP8A/wD/B/+a//3/tP9o/0z/Xf+n//z/p/8D/wD/AP8A/wD/AP8A/5X////S/5v/3////2b/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/yH/nv9g/wD/AP8A/wD/AP8b//v/8v+U/6D/Gv9L////4f+Q/5z/Av8A/wD/AP8A/wD/av///+n/mP+z/+3///+o/wD/AP8A/wD/AP8b//v/8v+U/6D/Gv/g//T/AP8A/wD/AP8A/xv/+//y/5T/oP8a/0v////h/5D/nP8S////xP8A/wD/AP8A/wL/yv///zz/AP8A/zz///+6/wD/AP8A/wD/AP81/6T/pP+k/6T/pP/w////ZP8A/wD/AP8A/1j///9j/wD/AP8A/wD/AP8A/wD/AP8A/wD/Pv+Q//z/rf+I/0P/Af8A/wD/AP8A//D/5P8A/wD/AP8A/wD/AP8A/wD/AP8A/wX/1P///8//rf/N//7/Yf8A/wD/AP8A/wf/0P///7//lf/X////lf8A/wD/AP8A/wD/JP/y//X/if+K//b/4P8I/wD/AP8A/wD/GP///8j/AP8A/wD/AP8A/+j/+P8A/wD/AP8A/8H//f+V/33/qf/P/wH/AP8A/wD/AP8A/wD/zP/U/wD/AP8A/wD/AP8A/wD/AP+W////wv95/8T///9o/wD/AP8A/wD/AP8A/wD/AP+c/+r/Pf8A/wD/AP8A/wD/Q//4/3//AP8A/wD/AP8A/xf//f/S/wX/AP8P/+D/7f8G/wD/AP8A/wD/AP8A/wD/AP8d/5n/+v/j/zn/AP8A/wD/AP8A/0b///+U/wD/AP8A/3r///9g/wD/AP8A/wD/AP8A/wD/AP/i//7/Kv8A/wD/iP///6j/AP8A/wD/AP8A/0b///+U/wD/AP8A/+D/9P8A/wD/AP8A/wD/Rv///5T/AP8A/wD/ev///2D/AP8A/xD////E/wD/AP8A/wD/AP8y//z/zv8C/wL/zv/4/yX/AP8A/wD/AP8A/wD/AP8A/wD/AP9F////x/8C/wD/AP8A/wD/Cf/z/77/AP8A/wD/AP8A/wD/AP8A/wD/f////+z//f/W//j/2/8B/wD/AP8A/wD/8P/k/wD/AP8A/wD/AP8A/wD/AP8A/wD/P////7X/AP8A/wD/G/8J/wD/AP8A/wD/X////6b/AP8A/wn/2f/+/yP/AP8A/wD/AP+d////Xv8A/wD/av///2r/AP8A/wD/AP8Y////yP8A/wD/AP8A/wD/6P/4/wD/AP8A/wD/8P/o/wb/AP8A/wD/AP8A/wD/AP8A/xX/yP///////////0z/AP8A/wD/AP8f//3/2v8E/wD/Bv/k/+n/AP8A/wD/AP8A/wD/AP9D//7/Rv8A/2D/2f/5/+r/vP8R/3v/8/8L/wD/AP8A/wD/Qv///4n/AP8A/wD/hP///0H/AP8A/wD/AP8A/wD/Gf+T//n/2/9k/wb/AP8A/wD/AP8A/23/6f////////+o/5X/9f////////90/wD/AP8A/wD/AP8U////zf8A/wD/AP8z////qP8A/wD/AP8A/23/6f////////+o/wD/4P/0/wD/AP8A/wD/bf/p/////////6j/lf/1/////////3T/EP///8T/AP8A/wD/AP8A/wD/kv///2X/Zv///4D/AP8A/wD/AP8A/wD/AP8A/wD/AP8K/93/+v8s/wD/AP8A/wD/AP8A/6L//f8b/wD/AP8A/wD/AP8A/wD/A//2/+H/C//0/xj/Cv8m/wD/AP8A/wD/AP/w/+T/AP8A/xj/3v/z/zT/AP8A/wD/AP9G////nP8A/wD/AP8A/wD/AP8A/wD/AP+e////S/8A/wD/AP+F////ZP8A/wD/AP8A/93///8i/xT/FP87////mv8A/wD/AP8A/xj////I/wD/AP8A/wD/AP/o//j/AP8A/wD/AP+k////1/9l/wr/AP8A/wD/AP8A/wD/FP9u////5v9s/2z/IP8A/wD/AP8A/13///+X/xT/FP8U/7H///8a/wD/AP8A/wD/AP8A/6v/wv8A/1D///+U/0D/k////xP/Gf///07/AP8A/wD/AP8/////kf8A/wD/AP+C////Yf8A/wD/AP8A/w//jf/3/9P/Wv8D/wD/AP8A/wD/AP8A/wD/Tf+X////vP9s/0b/Y/+2////nv9s/zD/AP8A/wD/AP8A/yz///+2/wD/AP8A/xz///+o/wD/AP8A/wD/Tf+X////vP9s/0b/AP/g//T/AP8A/wD/AP9N/5f///+8/2z/Rv9j/7b///+e/2z/MP8Q////xP8A/wD/AP8A/wD/AP8O/+b/6v/r/9v/B/8A/wD/AP8A/wD/AP8A/wD/AP8A/4z///+B/wD/AP8A/wD/AP8A/wD/R////3P/AP8A/wD/AP8A/wD/AP8B//T/7f8g//T/GP8A/wD/AP8A/wD/AP8A//D/5P8A/w7/0P/6/0b/AP8A/wD/AP8A/xH/8v/6/2f/BP8A/wD/AP8A/wD/AP8A/67///82/wD/AP8A/2////93/wD/AP8A/wD/8P////////////////+z/wD/AP8A/wD/GP///8j/AP8A/wD/AP8A/+j/+P8A/wD/AP8A/wX/fv/t////7/9f/wD/AP8A/wD/AP8A/wT////U/wD/AP8A/wD/AP8A/wD/cP///////////////////zP/AP8A/wD/AP8A/wD/8f91/wD/zf/B/wD/AP9u////CP8A//D/bv8A/wD/AP8A/xL/9f/s/zj/Cv9N//H///9q/wD/AP8A/wD/Nv/9//L/af8L/wD/AP8A/wD/AP8A/wD/AP8A/0z///+M/wD/AP8A/4D///9Y/wD/AP8A/wD/AP8A/wD/Fv///8j/AP8A/wD/K////6j/AP8A/wD/AP8A/0z///+M/wD/AP8A/+D/9P8A/wD/AP8A/wD/TP///4z/AP8A/wD/gP///1j/AP8A/xD////E/wD/AP8A/wD/AP8A/wD/X///////Sv8A/wD/AP8A/wD/AP8A/wD/AP8A/zL//P/W/wb/AP8A/wD/AP8A/wD/AP8D/+j/zv8A/wD/AP8A/wD/AP8A/wD/eP////j//f9P/wD/AP8A/wD/AP8A/wD/8P/i/wb/vv/+/1v/AP8A/wD/AP8A/wD/AP9Q//b////i/2//B/8A/wD/AP8A/wD/mf///0z/AP8A/wD/hf///2T/AP8A/wD/AP/e//3/SP9E/0T/RP9E/y//AP8A/wD/AP8Y////yP8A/wD/AP8A/wD/6P/4/wD/AP8A/wD/AP8A/wr/a//y//3/Kf8A/wD/AP8A/wD/BP///9T/AP8A/wD/AP8A/wD/AP9e////pP9E/0T/RP9E/0T/Df8A/wD/AP8A/wD/D////1b/Av/4/4L/AP8A/33//f8A/wD/7v9x/wD/AP8A/wD/AP9q//z///////j/qf///1z/AP8A/wD/AP8A/yT/lv/1//D/kP8l/wD/AP8A/wD/AP8A/wD/TP///4z/AP8A/wD/gP///1j/AP8A/wD/AP8A/wD/AP8A/+b/+/8g/wD/AP92////qP8A/wD/AP8A/wD/TP///4z/AP8A/wD/4P/0/wD/AP8A/wD/AP9M////jP8A/wD/AP+A////WP8A/wD/EP///8T/AP8A/wD/AP8A/wD/AP+d//////+A/wD/AP8A/wD/AP8A/wD/AP8A/wP/zv/+/zv/AP8A/wD/AP8A/wD/AP8A/wD/kf///yj/AP8A/wD/AP8A/wD/AP8A/0v/w///////z/80/wD/AP8A/wD/AP/w/9b/l////3b/AP8A/wD/AP8A/wD/AP8A/wD/HP+X//f////S/xf/AP8A/wD/AP9T////qv8A/wD/CP/Z//7/Jv8A/wD/AP8A/5z///9V/wD/AP8A/wD/AP8A/wD/AP8A/xj////I/wD/AP8A/wD/AP/o//j/AP8A/wD/AP8H/wD/AP8A/4P///9R/wD/AP8A/wD/AP8E////1P8A/wD/AP8A/wD/AP8A/x///f/P/wX/AP8A/wD/AP8A/wD/AP8A/wD/AP8Z////Tv8B//b/g/8A/wD/pf/2/wD/FP/+/0r/AP8A/wD/AP8A/wD/Lv9t/3D/JP+B////N/8A/wD/AP8A/wD/AP8A/xP/fP/o//7/uP8q/wD/AP8A/wD/AP9M////jP8A/wD/AP+A////WP8A/wD/AP8A/wD/AP8A/wD/cv///+P/j/+l/+v///+o/wD/AP8A/wD/AP9M////jP8A/wD/AP/g//T/AP8A/wD/AP8A/0z///+M/wD/AP8A/4D///9Y/wD/AP8Q////xP8A/wD/AP8A/wD/AP86//7/sf/T//j/J/8A/wD/AP8A/wD/AP8A/wD/dv///5X/AP8A/wD/AP8A/wD/AP8A/wD/AP82////g/8A/wD/AP8A/wD/AP8A/wD/AP8A//T/lP/5//H/FP8A/wD/AP8A//D/9///////lf8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/GP+0////nP8A/wD/AP8A/wL/w////8H/lP/V////m/8A/wD/AP8A/wD/IP/t//r/pf+C/5T/y/9C/wD/AP8A/wD/Fv///8z/AP8A/wD/AP8A/+z/9v8A/wD/AP8A/+j/pP98/4L/6P/0/xz/AP8A/wD/AP8A/wT////U/wD/AP8A/wD/AP8A/wD/AP+N////1v+L/4j/qv+x/wD/AP8A/wD/AP8A/wb/+/9u/wD/uv/Y/x7/O//z////L/+I/+n/Cf8A/wD/AP8A/wD/AP8A/wD/AP8A/8z/8P8H/wD/AP8A/wD/AP8A/wD/AP8A/wf/Yv/U/2T/AP8A/wD/AP8A/0z///+M/wD/AP8A/4D///9Y/wD/AP8A/wD/AP8A/wD/AP8C/4P/6P/4/7//UP///6j/AP8A/wD/AP8A/0z///+M/wD/AP8A/+D/9P8A/wD/AP8A/wD/TP///4z/AP8A/wD/gP///1j/AP8A/xD////E/wD/AP8A/wD/AP8E/9D/9/8g/0L///++/wD/AP8A/wD/AP8A/wD/Iv/2/+P/Df8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/2v/d/wD/AP8A/wD/AP8A/wD/AP8A/wD/9P8Y/5n///9D/wD/AP8A/wD/8P/8/2f/x////07/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/xP////Q/wD/AP8A/wD/AP8L/4//4//6/9z/e/8D/wD/AP8A/wD/AP8A/yX/qf/s//r/6P+s/x7/AP8A/wD/AP8H//z/6f8A/wD/AP8A/w7////f/wD/AP8A/wD/m//h//j/7f+9/z3/AP8A/wD/AP8A/wD/AP/4/+P/AP8A/wD/AP8A/wD/AP8A/wH/bP/T//n/8//S/2n/AP8A/wD/AP8A/wD/AP/D/7v/AP8p/97////6/2v/rv////H/Sf8A/wD/AP8A/wD/AP8A/wD/AP8A/3L///+O/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wH/Dv8A/wD/AP8A/wD/TP///4z/AP8A/wD/gP///1j/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8w////qP8A/wD/AP8A/wD/TP///4z/AP8A/wD/4P/0/wD/AP8A/wD/AP9M////jP8A/wD/AP+A////WP8A/wD/EP///8T/AP8A/wD/AP8A/3L///+A/wD/AP+t////Xf8A/wD/AP8A/wD/AP+7////Tf8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP+A////OP8A/wD/AP8A/wD/HP+v/17/Nv/1/2X/4//3/xj/AP8A/wD/AP/w/+T/AP8j//P/7P8a/wD/AP8A/wD/AP8o/xb/AP8A/wD/Ov///7r/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/wf///2L/AP8A/wD/iv///5j/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/8X///+t/5f/Q/8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/1T///9a/wD/A/8m/xL/AP8B/yj/Df8A/wD/AP8A/wD/AP8A/1f/jv+M/8n////M/w3/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP9M////jP8A/wD/AP+A////WP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/zD///+o/wD/AP8A/wD/AP9M////jP8A/wD/AP/g//T/AP8A/wD/AP8A/0z///+M/wD/AP8A/4D///9Y/wD/AP8Q////xP8A/wD/AP8A/xr/8v/g/wn/AP8A/yD/9//q/xL/AP8A/wD/AP9X////8/+k/6T/pP+k/6T/cP8A/wD/AP8A/wD/AP8A/yX///+T/wD/AP8A/wD/AP8Y/+v////////////o/1D/AP8A/wD/AP8A//D/5P8A/wD/Y////73/Av8A/wD/AP8A/3j//P/K/6f/sP/2//3/Sf8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP84//f////H/6n/0v///+X/GP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/Lf/I//f/5v9H/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP+V//3/lv85/xT/GP8z/23/XP8A/wD/AP8A/wD/AP8A/wD/eP/7//X/0f98/wr/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/0z///+M/wD/AP8A/4D///9Y/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/MP///6j/AP8A/wD/AP8A/0z///+M/wD/AP8A/+D/9P8A/wD/AP8A/wD/TP///4z/AP8A/wD/gP///1j/AP8A/xD////E/wD/AP8A/wD/qv///1P/AP8A/wD/AP+D////nP8A/wD/AP8A/3z///////////////////+w/wD/AP8A/wD/AP8A/wD/AP/K/+r/BP8A/wD/AP8A/wD/A/8w/0j/9/9F/wT/AP8A/wD/AP8A/wD/8P/k/wD/AP8A/67///93/wD/AP8A/wD/OP+0/+b/+f/m/7b/PP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/Mf+v/+z/+v/h/5b/F/8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/Xv/V////////////3v9b/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8w////qP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP/0/xj/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/F/8z/zD/GP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/1v/Cf8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/5X/7P8f/wD/AP8A/wD/AP8A/1X///9L/wD/AP8A/wD/Of/+/2n/AP8A/wD/AP8A/wD/zP//////5P8A/wD/AP8A/5j/////////EP8A/wD/AP8A/wD/AP8A/1T/vP/u//n/4P+b/yD/AP8A/wD/AP8A/wD/AP8A/wD/d//Y/8r/AP8A/wD/AP+e/+D/iP8C/wD/AP8A/wD/AP8A/wD/AP8A/4z///9U/wD/AP8A/wD/TP///xz/AP8A/wD/AP9w////aP8A/wD/AP8A/wD/Av94/9r/+f/o/5j/Ef8A/wD/AP8A/wD/MP///6j/AP8A/wD/AP8A/wD/AP8A/wD/AP9P////q/8A/wD/AP8V//z/4/8C/wD/AP8A/wD/AP8A/xT/qv/s//b/vP8A/wD/AP8A/wD/Bf+H/97/+P/n/7P/MP8A/wD/AP8A/3D///9o/wD/AP8A/wD/AP8A/wD/AP8A/wD/EP/h/9D/BP8A/wD/AP8A/wD/Ff+a/+b/+f/j/4j/AP8A/wD/AP8w////qP8A/wD/AP8A/wD/AP8A/wD/AP8A/yX/7f+O/wD/AP8A/wD/kv///1r/AP8A/wD/T////6D/AP8A/wD/AP8A/zf///8U/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A//D/6P8A/wD/AP8A/wD/AP8A/wD/pf/4/yX/AP8A/wD/AP8A/w7/6/+2/wD/AP8A/wD/AP8A/6P/8/8Z/wD/AP8A/wD/AP/M/+//aP9c/wD/AP8A/wD/Pf9o/8L///8Q/wD/AP8A/wD/AP8A/4/////6/77/qv/W////7/80/wD/AP8A/wD/AP8A/wD/Vv///9r/cP8A/wD/AP8A/1X/z////2T/AP8A/wD/AP8A/wD/AP8A/wD/jP///1T/AP8A/wD/AP9M////HP8A/wD/AP8A/3D///9o/wD/AP8A/wD/AP+X////1/+V/7/////O/wf/AP8A/wD/AP8w////qP8A/wD/AP8A/wD/AP8A/wD/AP8A/wT/6P/3/w3/AP8A/2f///+I/wD/AP8A/wD/AP8A/wD/l////8D/kv9u/wD/AP8A/wD/AP+B////s/97/5r/4v8g/wD/AP8A/wD/cP///2j/AP8A/wD/AP8A/wD/AP8A/wD/AP8j/////P8O/wD/AP8A/wD/CP/U////y/+a/8D/h/8A/wD/AP8A/zD///+o/wD/AP8A/wD/AP8A/wD/AP8A/wD/LP/5/57/AP8A/wD/AP80////sf8A/wD/AP+l////Q/8A/wD/AP8A/wD/jf///xT/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/8P/o/wD/AP8A/wD/AP8A/wD/AP8B/wj/AP8A/wD/AP8A/wD/cP///0f/AP8A/wD/AP8A/wD/Nf///4L/AP8A/wD/AP8A/8z/5P8A/wD/AP8A/wD/AP8A/wD/mP///xD/AP8A/wD/AP8A/0j////n/yn/AP8A/wD/c////9r/A/8A/wD/AP8A/wD/AP+L////M/8A/wD/AP8A/wD/AP8l////l/8A/wD/AP8A/wD/AP8A/wD/AP+M////VP8A/wD/AP8A/0z///8c/wD/AP8A/wD/cP///2j/AP8A/wD/AP8h//7/3P8K/wD/AP+i////Yv8A/wD/AP8A/zD///+n/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP+K////XP8A/wD/u////yz/AP8A/wD/AP8A/wD/AP/G////FP8A/wD/AP8A/wD/AP8A/7D///8v/wD/AP8A/wD/AP8A/wD/AP9w////Z/8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/Tv9D/wD/AP8A/wD/AP9h////sf8B/wD/AP8A/wD/AP8A/wD/MP///6f/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wn/Af8A/wD/AP8A/wD/1//4/w//AP8H//L/4/8C/wD/AP8A/wD/n//+/////////4z/AP8A/wD/AP8A/wD/AP8A/wD/AP/v/+j/AP8A/wD/AP8A/wD/AP8A/7D///8o/wD/AP8A/wD/AP/P/+n/Av8A/wD/AP8A/wD/AP8A/9f/4f8A/wD/AP8A/wD/zP/k/wD/AP8A/wD/AP8A/wD/AP+Y////EP8A/wD/AP8A/wD/sv///2D/AP8A/wD/AP8A/8X///9K/wD/AP8A/wD/AP8A/5D///8g/wD/AP8A/wD/AP8A/xT///+g/wD/AP8A/wD/AP8A/wD/AP8A/4z///9U/wD/AP8A/wD/TP///xz/AP8A/wD/AP9w////aP8A/wD/AP8A/17///+L/wD/AP8A/0X///+k/wD/AP8A/wD/MP///6H/ff/m//f/vv8p/wD/AP8A/wD/AP8A/yj///+1/wD/E//7/8//AP8A/wD/AP8A/wD/G/+8//7/////////KP8A/wD/AP8A/wD/ZP///+3/gP8a/wD/AP8A/wD/AP8A/3D///9q/53/7//t/7L/If8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/57///9O/wD/AP8A/wD/AP8A/wD/AP8w////nf94/+P/9P/K/0H/AP8A/wD/AP8A/zD///+o/wD/AP8A/wD/AP96////Xv8A/1D///+H/wD/AP8A/wD/AP9l/93///93/2z/O/8A/wD/AP8A/wD/UP/W//n/1/9U/+T/6P8A/wD/AP8A/wD/AP8A/wD/sP///yj/AP8A/wD/AP8P//3/rf8A/wD/AP8A/wD/AP8A/wD/mv///yD/AP8A/wD/AP/M/+T/AP8A/wD/AP8A/wD/AP8A/5j///8Q/wD/AP8A/wD/AP/s////FP8A/wD/AP8A/wD/eP///4X/AP8A/wD/AP8A/wD/kP///yD/AP8A/wD/AP8A/wD/FP///6D/AP8A/wD/AP8A/wD/AP8A/wD/jP///1T/AP8A/wD/AP9M////HP8A/wD/AP8A/3D///9o/wD/AP8A/wD/bv///3b/AP8A/wD/L////7f/AP8A/wD/AP8w////8P/f/5b/u////+D/Bf8A/wD/AP8A/wD/AP/F//r/E/9j////cv8A/wD/AP8A/wD/AP8X/2z/4f///3L/bP8Q/wD/AP8A/wD/AP8A/1j/2f////v/kf8C/wD/AP8A/wD/cP///+v/1P+U/8b////H/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/sP///zb/AP8A/wD/AP8A/wD/AP8A/zD////r/+n/mv+r//7/8f8V/wD/AP8A/wD/MP///6j/AP8A/wD/AP8A/x7//v+0/wD/pf///yn/AP8A/wD/AP8A/wD/xP///xT/AP8A/wD/AP8A/wD/L//9//v/o/+h//L/9P/o/wD/AP8A/wD/AP8A/wD/AP+w////KP8A/wD/AP8A/zv///99/wD/AP8A/wD/AP8A/wD/AP9p////Tv8A/wD/AP8A/8z/5P8A/wD/AP8A/wD/AP8A/wD/mP///xD/AP8A/wD/AP8E////9v8A/wD/AP8A/wD/AP9b////n/8A/wD/AP8A/wD/AP+0////FP8A/wD/AP8A/wD/AP8K//7/v/8A/wD/AP8A/wD/AP8A/wD/AP+M////VP8A/wD/AP8A/0z///8c/wD/AP8A/wD/cP///2j/AP8A/wD/AP9Z////jP8A/wD/AP9F////pP8A/wD/AP8A/zD////1/xT/AP8A/6v///9b/wD/AP8A/wD/AP8A/2P///9d/7b//P8Z/wD/AP8A/wD/AP8A/wD/AP/M////DP8A/wD/AP8A/wD/AP8A/wD/AP8B/0v/2v///2f/AP8A/wD/AP9w////1P8G/wD/Av/e////Ef8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP+h////Tf8A/wD/AP8A/wD/AP8A/wD/MP////r/If8A/wD/of///1H/AP8A/wD/AP8w////qP8A/wD/AP8A/wD/AP+///n/FP/x/8z/AP8A/wD/AP8A/wD/AP/E////FP8A/wD/AP8A/wD/AP+k////aP8A/wD/Rv///+j/AP8A/wD/AP8A/wD/AP8A/7D///8o/wD/AP8A/wD/T////2j/AP8A/wD/AP8A/wD/AP8A/1X///9i/wD/AP8A/wD/zP/k/wD/AP8A/wD/AP8A/wD/AP+Y////EP8A/wD/AP8A/wT////1/wD/AP8A/wD/AP8A/1v///+a/wD/AP8A/wD/XP+6////n/8A/wD/AP8A/wD/AP8A/wD/k////7r/Vf8A/wD/AP8A/wD/AP8A/4z///9U/wD/AP8A/wD/TP///xz/AP8A/wD/AP9w////aP8A/wD/AP8A/xf//P/g/wv/AP8A/6L///9k/wD/AP8A/wD/MP///77/AP8A/wD/Vv///4n/AP8A/wD/AP8A/wD/DP/z/6T/9v+5/wD/AP8A/wD/AP8A/wD/AP8A/8z///8M/wD/AP8A/wD/AP8A/wD/B/8A/wD/AP9D////kf8A/wD/AP8A/3D///+D/wD/AP8A/7D///8q/wD/AP8A/wD/AP9P/0P/AP8A/wD/AP8A/2n///+v/wH/AP8A/wn/AP8A/wD/AP8w////w/8A/wD/AP9w////av8A/wD/AP8A/zD///+o/wD/AP8A/wD/AP8A/2L///+S////bv8A/wD/AP8A/wD/AP8A/8T///8U/wD/AP8A/wD/AP8A/9X///8N/wD/AP8A//H/6P8A/wD/AP8A/wD/AP8A/wD/sP///yj/AP8A/wD/AP9W////Yv8A/wD/AP8A/wD/AP8A/wD/Tv///2n/AP8A/wD/AP/M/+T/AP8A/wD/AP8A/wD/AP8A/5j///8Q/wD/AP8A/wD/AP/r////E/8A/wD/AP8A/wD/eP///4D/AP8A/wD/AP+k////z/87/wD/AP8A/wD/AP8A/wD/AP8v/8b///+Y/wD/AP8A/wD/AP8A/wD/jP///1T/AP8A/wD/AP9M////HP8A/wD/AP8A/3D///9o/wD/AP8A/wD/AP+G////2f+U/73////T/wj/AP8A/wD/AP8w////rP8A/wD/AP9C////oP8A/wD/AP8A/wD/AP8A/57/+////1z/AP8A/wD/AP8A/wD/AP8A/wD/zP///wz/AP8A/wD/AP8A/wD/AP+z/7b/hP95/87///9R/wD/AP8A/wD/cP///2z/AP8A/wD/rP///yz/AP8A/wD/AP8k/////P8P/wD/AP8A/wD/Df/f////yf+Z/7r/r/8A/wD/AP8A/zD///+s/wD/AP8A/2z///9s/wD/AP8A/wD/MP///6j/AP8A/wD/AP8A/wD/Df/2//P/+/8V/wD/AP8A/wD/AP8A/wD/xP///xT/AP8A/wD/AP8A/wD/7P/2/wD/AP8A/wD/3P/o/wD/AP8A/wD/AP8A/wD/AP+w////KP8A/wD/AP8A/0T///90/wD/AP8A/wD/AP8A/wD/AP9h////Vv8A/wD/AP8A/8z/5P8A/wD/AP8A/wD/AP8A/wD/mP///xD/AP8A/wD/AP8A/7H///9f/wD/AP8A/wD/AP/E////Qf8A/wD/AP8A/wX/NP/j//H/B/8A/wD/AP8A/wD/AP8A/+T/6P80/wT/AP8A/wD/AP8A/wD/AP+M////VP8A/wD/AP8A/0z///8c/wD/AP8A/wD/cP///2j/AP8A/wD/AP8A/wD/a//V//j/6P+b/xT/AP8A/wD/AP8A/zD////A/wD/AP8A/1j///+I/wD/AP8A/wD/AP8A/wD/O/////T/C/8A/wD/AP8A/wD/AP8A/wD/AP/M////DP8A/wD/AP8A/wD/AP8A/2z/1v/0//P/z/9j/wD/AP8A/wD/AP9w////aP8A/wD/AP+s////LP8A/wD/AP8A/w7/3f/Q/wT/AP8A/wD/AP8A/x7/p//t//n/3/9r/wD/AP8A/wD/MP///6j/AP8A/wD/bP///2z/AP8A/wD/AP8w////qP8A/wD/AP8A/wD/AP8A/6f///+y/wD/AP8A/wD/AP8A/wD/AP+5////I/8A/wD/AP8A/wD/AP/W////Cf8A/wD/AP/t/+j/AP8A/wD/AP8A/wD/AP8A/7D///8o/wD/AP8A/wD/JP///5j/AP8A/wD/AP8A/wD/AP8A/4T///83/wD/AP8A/wD/zP/k/wD/AP8A/wD/AP8A/wD/AP+Y////EP8A/wD/AP8A/wD/R////+X/Jv8A/wD/AP9v////1/8B/wD/AP8A/wD/AP8A/5X///8f/wD/AP8A/wD/AP8A/xH///+l/wD/AP8A/wD/AP8A/wD/AP8A/4z///9U/wD/AP8A/wD/TP///xz/AP8A/wD/AP9w////aP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/MP////j/Gf8A/wD/rv///1f/AP8A/wD/AP8A/wD/AP82////o/8A/wD/AP8A/wD/AP8A/wD/AP8A/8z///8M/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/3D///9o/wD/AP8A/6z///8s/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8w////qP8A/wD/AP9s////bP8A/wD/AP8A/zD///+o/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/4X////K/4//bf8A/wD/AP8A/6f///9d/wD/AP83////6P8A/wD/AP8A/wD/AP8A/wD/sP///yj/AP8A/wD/AP8A/+j/0/8A/wD/AP8A/wD/AP8A/wD/wP/1/wX/AP8A/wD/AP/M/+T/AP8A/wD/AP8A/wD/AP8A/5j///8Q/wD/AP8A/wD/AP8A/4/////4/7n/pv/T////7/8s/wD/AP8A/wD/AP8A/wD/kP///yD/AP8A/wD/AP8A/wD/FP///6D/AP8A/wD/AP8A/wD/AP8A/wD/jP///1T/AP8A/wD/AP9M////HP8A/wD/AP8A/3D///9o/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8w////8//j/5f/u////9z/BP8A/wD/AP8A/wD/AP8A/6z///88/wD/AP8A/wD/AP8A/wD/AP8A/wD/zP///wz/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/cP///2j/AP8A/wD/rP///yz/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/zD///+o/wD/AP8A/2z///9s/wD/AP8A/wD/MP///6j/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/EP+s//H/8P98/wD/AP8A/wD/NP/+//j/nf+Z/+n/8f/o/wD/AP8A/wD/AP8A/wD/AP+w////KP8A/wD/AP8A/wD/l////yb/AP8A/wD/AP8A/wD/F//6/6n/AP8A/wD/AP8A/8z/5P8A/wD/AP8A/wD/AP8A/wD/mP///xD/AP8A/wD/AP8A/wD/AP9V/73/7///////1f8Y/wD/AP8A/wD/AP8A/wD/AP+O////JP8A/wD/AP8A/wD/AP8Y////n/8A/wD/AP8A/wD/AP8A/wD/AP+R////S/8A/wD/AP8A/0z///8c/wD/AP8A/wD/cP///2j/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/zD///9X/4f/6f/3/7v/Jf8A/wD/AP8A/wD/GP+Q/7n///+x/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP/M////DP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP9w////aP8A/wD/AP+s////LP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/MP///6j/AP8A/wD/bP///2z/AP8A/wD/AP8w////qP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/1f/2f/5/9T/Sv+m/+j/AP8A/wD/AP8A/wD/AP8A/7D///8o/wD/AP8A/wD/AP8o//3/j/8A/wD/AP8A/wD/AP96////OP8A/wD/AP8A/wD/zP/n/xz/GP8A/wD/AP8A/xD/HP+j////EP8A/wD/AP8A/wD/AP8A/wD/AP8A/xb/3////2T/AP8A/wD/AP8A/wD/AP8A/27///+U/yP/AP8A/wD/AP8a/4n///+E/wD/AP8A/wD/AP8A/wD/AP8B/8b///8q/wD/AP8A/wD/TP///xz/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8i//D/7P+a/w3/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/w////xv/AP8A/wD/AP8A/wD/i//4/yP/AP8A/wD/AP8X//D/nf8A/wD/AP8A/wD/AP/M///////k/wD/AP8A/wD/mP////////8Q/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8p/+///f9X/wD/AP8A/wD/AP8A/wD/D//T////1P8A/wD/AP8A/6T////c/xz/AP8A/wD/AP8A/wD/LP+0/8r////J/wD/AP8A/wD/AP9M////HP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/5j/pP/+/+D/Af8A/wD/AP8A/wD/AP8H/0j/I/8A/wD/AP8A/x3/SP8M/wD/AP8A/wD/AP8A/zz/TP9M/0P/AP8A/wD/AP8t/0z/TP9M/wT/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/Of+A/3r/Cv8A/wD/AP8A/wD/AP8A/wL/Mf8+/wD/AP8A/wD/Lv8y/wL/AP8A/wD/AP8A/wD/AP8t/+n/7f+v/xz/AP8A/wD/AP8A/0z///8c/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/3P/4/8z/N/8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/TP///xz/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/77/9P/0//T/9P/0//T/Jv8A/wD/AP8A/0T/9P/0//T/9P/0//T/oP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/Gf8g/yD/IP8g/yD/IP8F/wD/AP8A/wD/Cf8g/yD/IP8g/yD/IP8V/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/zD///9S/1f/3P/3/w7/AP8A/wD/AP9w////Pf+z//X/8f+s/xb/gf/k//X/zP8//wD/AP8A/wD/AP/w/5z/Zf/X//j/2/9u/wD/AP8A/wD/AP92//X/W/8A/wD/AP8A/wD/Lf+z//D/9//K/03/AP8A/wD/AP8A/wD/AP8w/7T/7//3/9b/WP8A/wD/AP8A/z3/8v+X/wD/AP8A/wD/AP9g/9D/9f/t/8X/Vf8A/wD/AP8A/wD/Wf+7/+j/9P/P/1T/AP8A/wD/AP8A//D/nP9t/97/+f/a/1z/L/+///b/5v+U/wj/AP8A/wD/AP8w////Zf+V/+v/9//H/zP/Vv/U//j/3P9q/wD/AP8A/wD/AP/w/5L/MP/H//j/S/8A/wD/AP8A/wT////Y/wD/AP8A/zz///+c/wD/AP8A/wD/AP83/6f/4P/3/93/fv8C/wD/AP8A/wD/RP///5j/AP8A/wD/fP///1z/AP8A/wD/AP9w////Ov+r//D/7v+0/yL/AP8A/wD/AP8A/4T///9Y/wD/AP8A/7z///8c/wD/AP8A/wD/IP/0/+v/E/8A/wD/rf///2P/AP8A/wD/AP8b/2X/Ev8A/wD/AP8A/wj/Yf8p/wD/AP8A/wD/AP9P/0P/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/MP///7j//v/a/8L/AP8A/wD/AP8A/3D////4/6j/bP/H////7P/e/3T/if/8/+n/Cv8A/wD/AP8A//D/+P/s/3//cf/i////SP8A/wD/AP8A/6P///+L/wD/AP8A/wD/Jf/y//z/qf+a/+v//v9W/wD/AP8A/wD/AP8o//T//v+1/5z/0v9L/wD/AP8A/wD/Y////8v/AP8A/wD/AP9B////0v98/43/0f9c/wD/AP8A/wD/AP9+/7L/hP98/97//P8v/wD/AP8A/wD/8P/4/+b/d/+E//r//P/v/5//bP/N////dP8A/wD/AP8A/zD////4/8j/bv+k////7//z/4T/c//r////NP8A/wD/AP8A//D/zP/q/+j/xf8v/wD/AP8A/wD/BP///9j/AP8A/wD/PP///5z/AP8A/wD/AP8A/0b/xP+L/3f/wf///2z/AP8A/wD/AP9E////mP8A/wD/AP98////XP8A/wD/AP8A/3D////4/7L/bP+g////yP8A/wD/AP8A/wD/hP///1j/AP8A/wD/vP///xz/AP8A/wD/AP8A/23///+f/wD/Tf///7n/AP8A/wD/AP8A/6T///+L/wD/AP8A/wD/ZP///8v/AP8A/wD/AP8k/////P8P/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8w//////9m/wD/AP8A/wD/AP8A/wD/cP///7//AP8A/yT//////yv/AP8A/67///80/wD/AP8A/wD/8P///0X/AP8A/1T///+R/wD/AP8A/wD/Gv9l/xL/AP8A/wD/AP+f////Zv8A/wD/Jv/8/+H/Af8A/wD/AP8A/6H///9y/wD/AP8A/wD/AP8A/wD/AP8H/2H/Kf8A/wD/AP8A/3D///9v/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/U////3L/AP8A/wD/AP/w////P/8A/wD/pP///6r/AP8A/y7///+0/wD/AP8A/wD/MP////L/DP8A/wH/4////2r/AP8A/27///90/wD/AP8A/wD/8P///6H/Bf8A/wD/AP8A/wD/AP8E////2P8A/wD/AP88////nP8A/wD/AP8A/wD/AP8A/wD/AP8T////sv8A/wD/AP8A/0T///+Y/wD/AP8A/3z///9c/wD/AP8A/wD/cP///8X/AP8A/wD/1P///xH/AP8A/wD/AP+E////WP8A/wD/AP+8////HP8A/wD/AP8A/wD/Af/C////TP/h//L/H/8A/wD/AP8A/wD/cP/1/1r/AP8A/wD/AP85//H/lf8A/wD/AP8A/w7/3f/Q/wT/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/zD////Q/wD/AP8A/wD/AP8A/wD/AP9w////ff8A/wD/Av///+r/AP8A/wD/iv///0v/AP8A/wD/AP/w//z/Av8A/wD/Lv///6r/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/97///8L/wD/AP8A/8X///8k/wD/AP8A/wD/3v///w//AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/K//5//r/nP8w/wD/AP8A/wD/AP8A/wD/Yv/I//H/+//9////h/8A/wD/AP8A//D/+/8B/wD/AP+C////av8A/wD/Cv///8v/AP8A/wD/AP8w////vf8A/wD/AP/C////Kv8A/wD/Sv///4v/AP8A/wD/AP/w////Ef8A/wD/AP8A/wD/AP8A/wT////Y/wD/AP8A/zz///+c/wD/AP8A/wD/AP87/7f/6v/6//z////H/wD/AP8A/wD/RP///5j/AP8A/wD/fP///1z/AP8A/wD/AP9w////f/8A/wD/AP+u////Kv8A/wD/AP8A/4T///9Y/wD/AP8A/7z///8c/wD/AP8A/wD/AP8A/yX/9v/8////aP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/MP///6r/AP8A/wD/AP8A/wD/AP8A/3D///9q/wD/AP8A////2P8A/wD/AP+I////TP8A/wD/AP8A//D/6v8A/wD/AP8s////rP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/7v/2/wD/AP8A/wD/r////zf/AP8A/wD/AP/w//b/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/zT/vf//////u/8T/wD/AP8A/wD/Wf///9X/Vf8x/2r///+I/wD/AP8A/wD/8P/q/wD/AP8A/4D///9Y/wD/AP8I////zP8A/wD/AP8A/zD///+q/wD/AP8A/8D///8Y/wD/AP9I////jP8A/wD/AP8A//D/6v8A/wD/AP8A/wD/AP8A/wD/BP///9j/AP8A/wD/QP///5z/AP8A/wD/AP8l//T/8P9p/zb/Nf///8j/AP8A/wD/AP9E////mP8A/wD/AP+A////XP8A/wD/AP8A/3D///9q/wD/AP8A/6z///8s/wD/AP8A/wD/hP///1j/AP8A/wD/wP///xz/AP8A/wD/AP8A/wD/AP+w////8v8J/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8w////qP8A/wD/AP8A/wD/AP8A/wD/cP///2j/AP8A/wD////Y/wD/AP8A/4j///9M/wD/AP8A/wD/8P/o/wD/AP8A/yz///+s/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP/Z////Df8A/wD/AP/F////JP8A/wD/AP8A/+H///8N/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/y//uP///6f/AP8A/wD/AP+y////O/8A/wD/XP///4j/AP8A/wD/AP/w/+j/AP8A/wD/gP///1j/AP8A/wj////M/wD/AP8A/wD/MP///6j/AP8A/wD/wP///xj/AP8A/0j///+M/wD/AP8A/wD/8P/o/wD/AP8A/wD/AP8A/wD/AP8D////3P8A/wD/AP9Y////nP8A/wD/AP8A/3L///97/wD/AP8c////yP8A/wD/AP8A/0P///+c/wD/AP8A/5j///9c/wD/AP8A/wD/cP///2j/AP8A/wD/rP///yz/AP8A/wD/AP+D////XP8A/wD/AP/Y////HP8A/wD/AP8A/wD/AP8+//7/6f///4n/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/zD///+o/wD/AP8A/wD/AP8A/wD/AP9w////aP8A/wD/AP///9j/AP8A/wD/iP///0z/AP8A/wD/AP/w/+j/AP8A/wD/LP///6z/AP8A/wD/AP8b/2X/Ev8A/wD/AP8A/5P///9r/wD/AP8m//z/4/8B/wD/AP8A/wD/qf///3D/AP8A/wD/Cf8A/wD/AP8A/wj/Yf8p/wD/AP8A/wD/B/8A/wD/AP8H//z/0f8A/wD/AP8A/7v///8u/wD/AP+t////iP8A/wD/AP8A//D/6P8A/wD/AP+A////WP8A/wD/CP///8z/AP8A/wD/AP8w////qP8A/wD/AP/A////GP8A/wD/SP///4z/AP8A/wD/AP/w/+j/AP8A/wD/AP8A/wD/AP8A/wD/6//4/xH/AP8A/63///+c/wD/AP8A/wD/e////27/AP8A/23////I/wD/AP8A/wD/K////8r/AP8A/wr/5P///1z/AP8A/wD/AP9w////aP8A/wD/AP+s////LP8A/wD/AP8A/2v///+K/wD/AP8v//////8c/wD/AP8A/wD/AP8K/9v/9/8m/8j//P82/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/MP///6j/AP8A/wD/AP8A/wD/AP8A/3D///9o/wD/AP8A////2P8A/wD/AP+I////TP8A/wD/AP8A//D/6P8A/wD/AP8s////rP8A/wD/AP8A/6T///+L/wD/AP8A/wD/Gv/s//3/qv+Z/+r///9c/wD/AP8A/wD/AP8z//r//v+y/5z/zP9z/wD/AP8A/wD/ZP///8v/AP8A/wD/AP93/8v/jP92/6////+R/wD/AP8A/wD/e////8v/ev+3/+L///+I/wD/AP8A/wD/8P/o/wD/AP8A/4D///9Y/wD/AP8I////zP8A/wD/AP8A/zD///+o/wD/AP8A/8D///8Y/wD/AP9I////jP8A/wD/AP8A//D/6P8A/wD/AP8A/wD/AP8A/wD/AP+k////0v+O/8D/6////5z/AP8A/wD/AP87////5/99/5z/7v/w/8j/AP8A/wD/AP8F/9////+3/5H/2P/r////XP8A/wD/AP8A/3D///9o/wD/AP8A/6z///8s/wD/AP8A/wD/KP/8//v/nv+Z/+7/6////xz/AP8A/wD/AP8A/4////95/wD/Lv/7/9X/B/8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8w////qP8A/wD/AP8A/wD/AP8A/wD/cP///2j/AP8A/wD////Y/wD/AP8A/4j///9M/wD/AP8A/wD/8P/o/wD/AP8A/yz///+s/wD/AP8A/wD/cP/1/1r/AP8A/wD/AP8A/yP/q//t//f/y/9T/wD/AP8A/wD/AP8A/wD/Pf/A//X/9f/P/z//AP8A/wD/AP85//H/lf8A/wD/AP8A/0H/x//v//j/3f+I/wf/AP8A/wD/AP8J/5z/7v/z/6//Gf/o/4j/AP8A/wD/AP/w/+j/AP8A/wD/gP///1j/AP8A/wj////M/wD/AP8A/wD/MP///6j/AP8A/wD/wP///xj/AP8A/0j///+M/wD/AP8A/wD/8P/o/wD/AP8A/wD/AP8A/wD/AP8A/xX/pf/p//X/t/8l/+//nP8A/wD/AP8A/wD/cf/j//j/yv84/6n/yP8A/wD/AP8A/wD/MP/A//L/7f+Z/zz///9c/wD/AP8A/wD/cP///2j/AP8A/wD/rP///yz/AP8A/wD/AP8A/1b/1P/3/+D/c/9w////HP8A/wD/AP8A/zn//f/T/wX/AP8A/4n///+H/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wL/iP///5j/AP8A/wD/AP8A/zT/rf/s//T/y/9P/wD/AP8A/wD/AP8A/wX/a//H//P/8v/N/13/AP8A/wD/AP8A/wD/Mv//////////////yP8A/wD/AP8A/wD/AP8A/wD/QP+y/+r/+//X/wD/AP8A/wD/AP/s//////////////////z/AP8A/wD/AP8A/zL/tv/s//D/w/9E/wD/AP8A/wD/AP8A/xn/pv/u//P/vv83/wD/AP8A/wD/AP8A/wH/0v/N/wD/AP8A/wD/AP8w////qP8A/wD/AP8A/wT//////////////////////5D/AP8A/wD/AP8Y//3/1P8A/wD/AP8A/wD/Zf///4j/AP8A/wD/AP8P/+7/8/8U/wD/AP8A/xn/9//p/wv/AP8A/wD/AP/Y////CP8A/wD/AP8A/6j///84/wD/AP8A/wD/AP8A/wD/AP8A/wD/sP///yj/AP8A/wD/AP8w////pP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/3D///9o/wD/AP8A/wD/cP///2T/AP8A/wD/AP8A/wD/AP8A/wD/AP+8////0P8D/wD/AP8A/wD/8P/I/wD/AP8A/wD/PP/////////4/9n/hv8L/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/w3/sv//////mP8A/wD/AP8A/zr//P/4/8D/qv/1//7/R/8A/wD/AP8A/wD/Sf///9//qf+k//L///9c/wD/AP8A/wD/AP9F////0P+s/6z/rP+G/wD/AP8A/wD/AP8A/wD/av////P/qP+P/5r/AP8A/wD/AP8A/5r/qP+o/6j/qP+t////4v8A/wD/AP8A/x3/7//y/47/h//q//r/Mv8A/wD/AP8A/wP/0P///7r/n//y//b/L/8A/wD/AP8A/wD/Av/j/93/AP8A/wD/AP8A/zD///+o/wD/AP8A/wD/Av+k/6T/pP/g////tv+k/6T/XP8A/wD/AP8A/wD/wf///yb/AP8A/wD/AP+3////M/8A/wD/AP8A/wD/e////4r/AP8A/wD/k////3H/AP8A/wD/AP8A/9j///8I/wD/AP8A/wD/qP///zj/AP8A/wD/AP8A/wD/AP8A/wD/AP+w////KP8A/wD/AP8A/zD///+k/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/cP///2j/AP8A/wD/AP9w////ZP8A/wD/AP8A/wD/AP8A/wD/AP8A/7z//////2//AP8A/wD/AP/w/8j/AP8A/wD/AP88////2v+c/67/7v///7n/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/xX/0//7/4////+Y/wD/AP8A/wD/Af+D/x//AP8A/0j///+q/wD/AP8A/wD/AP8A/0L/Av8A/wD/Rf///7H/AP8A/wD/AP8A/1n///9h/wD/AP8A/wD/AP8A/wD/AP8A/wD/Jv/5/9n/Gv8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/1v///97/wD/AP8A/wD/Yv///2z/AP8A/03///+B/wD/AP8A/wD/Vf///5f/AP8A/zP//P+0/wD/AP8A/wD/AP8A/wX/BP8A/wD/AP8A/wD/MP///6j/AP8A/wD/AP8A/wD/AP8A/6j///80/wD/AP8A/wD/AP8A/wD/AP9s////eP8A/wD/AP8P//n/3f8A/wD/AP8A/wD/AP8M/+v/9f8X/wD/HP/4/+T/CP8A/wD/AP8A/wD/2P///wj/AP8A/wD/AP+o////OP8A/wD/AP8A/wD/AP8A/wD/AP8A/6////8o/wD/AP8A/wD/MP///6T/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP9v////aP8A/wD/AP8A/3D///9k/wD/AP8A/wD/AP8A/wD/AP8A/wD/vP/q//b/8f8Y/wD/AP8A//D/yP8A/wD/AP8A/zz///+g/wD/AP8T/+X///8r/wD/AP8A/wD/AP8A/wD/AP8A/wD/Av+u/0T/Of///5j/AP8A/wD/AP8A/wD/AP8A/wD/Gf///8P/AP8A/wD/AP8A/wD/AP8A/wD/AP8t////pv8A/wD/AP8A/wD/bP///0z/AP8A/wD/AP8A/wD/AP8A/wD/AP+L////SP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/yv/5/xb/AP8A/wD/AP9X////ev8A/wD/Vf///3P/AP8A/wD/AP+C////Sf8A/wD/AP/E//j/CP8A/wD/AP8A/wD/8P/o/wD/AP8A/wD/AP8w////qP8A/wD/AP8A/wD/AP8A/wD/qP///zT/AP8A/wD/AP8A/wD/AP8A/xn//f/K/wD/AP8A/1r///+I/wD/AP8A/wD/AP8A/wD/df///47/AP+X////aP8A/wD/AP8A/wD/AP/Y////CP8A/wD/AP8A/6j///84/wD/AP8A/wD/AP8r/7//9//m/4H/pv///yj/AP8A/wD/AP8w////pP8A/wD/P//4/9X/Ev8A/wD/AP8A/wD/EP+i//H/8v+l/3b///9o/wD/AP8A/wD/cP///2T/AP8A/3j///+m/wH/AP8A/wD/AP+8/9//gf///6T/AP8A/wD/8P/I/wD/AP8A/wD/PP///6D/AP8A/wD/pf///03/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP88////mP8A/wD/AP8A/wD/AP8A/wD/AP9S////k/8A/wD/AP8A/wD/AP8A/wD/CP8x/8D/9v82/wD/AP8A/wD/AP+A////lP+J/3X/OP8A/wD/AP8A/wD/AP8A/8v/9f8D/wf/Gv8B/wD/AP8A/wD/AP8A/wD/AP8A/wD/Ov///6T/AP8A/wD/AP8A/wr/2f/3/2r/Uf/q/93/Ef8A/wD/AP8A/3////9R/wD/AP8A/8L///8h/wD/AP8A/wD/AP/w/+j/AP8A/wD/AP8A/zD///+o/wD/AP8A/wD/AP8A/wD/AP+o////NP8A/wD/AP8A/wD/AP8A/wD/AP/C////Hf8A/wD/rP///zP/AP8A/wD/AP8A/wD/AP8K/+f/9v84//n/3v8F/wD/AP8A/wD/AP8A/9j///8I/wD/AP8A/wD/qP///zj/AP8A/wD/AP8I/+T///+7/5f/4f/x////KP8A/wD/AP8A/zD///+k/wD/Lv/w/+P/Hf8A/wD/AP8A/wD/AP+s////1P+U/8v/8f///2j/AP8A/wD/AP9w////ZP8A/1////+7/wX/AP8A/wD/AP8A/7z/7P8J/+H///8//wD/AP/w/8j/AP8A/wD/AP88////oP8A/wD/AP+6////OP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/zz///+Y/wD/AP8A/wD/AP8A/wD/AP8K/9j/+v8n/wD/AP8A/wD/AP8A/wD/1P//////1f80/wD/AP8A/wD/AP8A/4X//////////////5f/AP8A/wD/AP8A/wD/8f/S/3n/9f////P/df8A/wD/AP8A/wD/AP8A/wD/AP+q////OP8A/wD/AP8A/wD/AP8Z/9f//////9P/F/8A/wD/AP8A/wD/R////8f/IP8P/3f//////yr/AP8A/wD/AP8A//D/6P8A/wD/AP8A/wD/MP///6j/AP8A/wD/AP8A/wD/AP8A/6j///80/wD/AP8A/wD/AP8A/wD/AP8A/23///9u/wD/Cf/0/93/AP8A/wD/AP8A/wD/AP8A/wD/bv////L///9f/wD/AP8A/wD/AP8A/wD/2P///wj/AP8A/wD/AP+o////OP8A/wD/AP8A/2T///+o/wD/AP8T//L///8o/wD/AP8A/wD/MP///6L/H//m/+7/K/8A/wD/AP8A/wD/AP8l//7/3v8K/wD/Av/D////aP8A/wD/AP8A/3D///9i/0r/+//N/w3/AP8A/wD/AP8A/wD/vP/y/wD/Vf///9T/BP8A//D/yP8A/wD/AP8A/zz///+g/wD/Ev9o//7/2f8C/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/PP///5j/AP8A/wD/AP8A/wD/AP8C/6z///9w/wD/AP8A/wD/AP8A/wD/AP9w/5D/rv/1/+//S/8A/wD/AP8A/wD/Av8u/w3/Df9I/+f///9J/wD/AP8A/wD/Af/+//f/2P9w/2j/3P///07/AP8A/wD/AP8A/wD/AP8d//v/zP8A/wD/AP8A/wD/AP8D/53///+9/9L///+q/wf/AP8A/wD/AP8A/6f/////////5P++////HP8A/wD/AP8A/wD/8P/o/wD/AP8A/wD/AP8w////qP8A/wD/AP8A/wD/AP8A/wD/qP///zT/AP8A/wD/AP8A/wD/AP8A/wD/Gv/9/8D/AP9Q////iP8A/wD/AP8A/wD/AP8A/wD/AP8H/+P////Y/wP/AP8A/wD/AP8A/wD/AP/Y////CP8A/wD/AP8A/6j///84/wD/AP8A/wD/lf///03/AP8A/wD/sv///yj/AP8A/wD/AP8w////nv/O//v/O/8A/wD/AP8A/wD/AP8A/1X///+N/wD/AP8A/3L///9o/wD/AP8A/wD/cP///3v/8f/g/xb/AP8A/wD/AP8A/wD/AP+8//T/AP8A/73///90/wD/7v/I/wD/AP8A/wD/PP//////////////0/8m/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP88////mP8A/wD/AP8A/wD/AP8A/5j///+N/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/yf/+//p/wD/AP8A/wD/AP8A/wD/AP8A/wD/cP///4j/AP8A/wD/AP8A//f/8v8Q/wD/AP86////of8A/wD/AP8A/wD/AP8A/4n///9g/wD/AP8A/wD/AP8A/3X///+D/wD/Af+E////kv8A/wD/AP8A/wD/AP9E/3T/ZP8R/8H/9f8C/wD/AP8A/wD/AP/w/+j/AP8A/wD/AP8A/zD///+o/wD/AP8A/wD/AP8A/wD/AP+o////NP8A/wD/AP8A/wD/AP8A/wD/AP8A/8P//P8V/6H///8z/wD/AP8A/wD/AP8A/wD/AP8A/wD/fv///3P/AP8A/wD/AP8A/wD/AP8A/9b///8M/wD/AP8A/wD/rP///zb/AP8A/wD/AP+s////Nv8A/wD/AP+c////KP8A/wD/AP8A/zD////3//////9V/wD/AP8A/wD/AP8A/wD/bP///3b/AP8A/wD/XP///2j/AP8A/wD/AP9w////9/////L/I/8A/wD/AP8A/wD/AP8A/7z/9P8A/wD/LP/7//P/G//o/8j/AP8A/wD/AP88////1/+U/7////9k/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/zz///+Y/wD/AP8A/wD/AP8A/43///+T/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP/h////FP8A/wD/AP8A/wD/AP8A/wD/AP9g////iP8A/wD/AP8A/wD/1//r/wD/AP8A/xr///+4/wD/AP8A/wD/AP8A/wr/7v/s/wj/AP8A/wD/AP8A/wD/wf/8/wf/AP8A/wD/4//l/wD/AP8A/wD/AP8A/wD/AP8A/xT/+P+4/wD/AP8A/wD/AP8A//D/6P8A/wD/AP8A/wD/MP///6j/AP8A/wD/AP8A/wD/AP8A/6j///80/wD/AP8A/wD/AP8A/wD/AP8A/wD/bv///17/6//d/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP90////bP8A/wD/AP8A/wD/AP8A/wD/xP///yr/AP8A/wD/AP/O////H/8A/wD/AP8A/5b///9J/wD/AP8A/63///8o/wD/AP8A/wD/MP///+r/Uf/u/+//Hv8A/wD/AP8A/wD/AP9W////if8A/wD/AP9t////aP8A/wD/AP8A/3D////K/2D////J/wT/AP8A/wD/AP8A/wD/vP/0/wD/AP8A/5L///+p/97/yP8A/wD/AP8A/zz///+g/wD/D//m/+//Gf8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/PP///5j/AP8A/wD/AP8A/4T///+V/wD/AP8A/wD/AP8A/wD/AP8A/x7/A/8A/wD/AP8s//3/8P8D/wD/AP8A/wD/Jf8A/wD/AP8D/7r///9R/wD/AP8A/wD/AP+N////Uf8A/wD/X////5L/AP8A/wD/AP8A/wD/af///4n/AP8A/wD/AP8A/wD/AP+9////I/8A/wD/EP/y/9v/AP8A/wD/AP8A/wD/AP8A/wX/rP///07/AP8A/wD/AP8A/wD/8P/o/wD/AP8A/wD/AP8w////qP8A/wD/AP8A/wD/AP8A/wD/qP///zT/AP8A/wD/AP8A/wD/AP8A/wD/AP8a//7/wf///4j/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/3T///9s/wD/AP8A/wD/AP8A/wD/AP+B////n/8C/wD/AP9L////2P8A/wD/AP8A/wD/Z////53/AP8A/wz/6////yj/AP8A/wD/AP8w////pP8A/1b////D/wP/AP8A/wD/AP8A/yj////X/wb/AP8A/7b///9o/wD/AP8A/wD/cP///2T/AP+X////hv8A/wD/AP8A/wD/AP+8//T/AP8A/wD/EP/r////+P/I/wD/AP8A/wD/PP///6D/AP8A/1j///+w/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP88////mP8A/wD/AP8A/2L////5/7H/sP+w/7D/sP8j/wD/AP8A/wD/lP/l/6n/j/+m//T///9z/wD/AP8A/wD/AP/U/9T/pf+c/9j////E/wP/AP8A/wD/AP8A/xb/6f/6/6b/pf/5//T/Jv8A/wD/AP8A/wD/Af/X//3/IP8A/wD/AP8A/wD/AP8A/13////h/4T/fv/V////cP8A/wD/AP8A/wD/fv+I/5X/3////5n/AP8A/wD/AP8A/wD/AP/w/+j/AP8A/wD/AP8A/zD///+o/wD/AP8A/wD/AP8A/wD/AP+o////NP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/xP//////M/8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/dP///2z/AP8A/wD/AP8A/wD/AP8A/xL/3f///9r/qv/A//7/+v9D/wD/AP8A/wD/AP8K/+j///+z/5H/2v/q////KP8A/wD/AP8A/zD///+k/wD/AP+j////f/8A/wD/AP8A/wD/AP+y////zv+P/8H/6v///2j/AP8A/wD/AP9w////ZP8A/wr/2P/9/0H/AP8A/wD/AP8A/7z/9P8A/wD/AP8A/2b//////8j/AP8A/wD/AP88////oP8A/wD/AP+5////WP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/zz///+Y/wD/AP8A/wD/jP///////////////////zT/AP8A/wD/AP9F/7j/5v/5/+X/u/9L/wD/AP8A/wD/AP8A/2//0f/w//n/2/+G/wr/AP8A/wD/AP8A/wD/AP8k/6//7//r/7b/K/8A/wD/AP8A/wD/AP9I////sf8A/wD/AP8A/wD/AP8A/wD/AP9S/8T/7v/x/8r/Wv8A/wD/AP8A/wD/AP+2//3/8P/B/1z/Af8A/wD/AP8A/wD/AP8A//D/6P8A/wD/AP8A/wD/MP///6j/AP8A/wD/AP8A/wD/AP8A/6j///80/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP9v////3v8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP90////bP8A/wD/AP8A/wD/AP8A/wD/AP8W/5b/4v/6/+r/rv8z/wD/AP8A/wD/AP8A/wD/MP/D//j/5f93/2b///8o/wD/AP8A/wD/MP///6T/AP8A/w7/3//8/zv/AP8A/wD/AP8A/xP/p//z//H/nv8z////aP8A/wD/AP8A/3D///9k/wD/AP8z//r/5P8T/wD/AP8A/wD/vP/0/wD/AP8A/wD/Av/M////yP8A/wD/AP8A/zz///+g/wD/AP8A/yP/9//r/xX/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/2b////y/wn/AP8A/wD/AP8A/wD/AP8A/7z//////////////7j/AP8A/wD/AP9J////nf8A/wD/AP8L//r///8a/wD/AP8A/3r///9n/wD/AP8A/wD/AP8A/xn/kf/b//j/8f/E/2D/Af8A/wD/AP8A/wD/AP88//////////v/6f+4/0X/AP8A/wD/AP8A/7z/////////9f/V/4n/Dv8A/wD/AP8A/wD/f////4j/AP8A/wD/AP+R////df8A/wD/AP8A//z//////////////3j/AP8A/wD/AP8A/wD/AP8A/6b///+8/wD/AP8A/wD/AP8A/wD/AP+8////IP8A/wD/AP8A/wD/AP8A/wD/AP+q////Zv8A/wD/AP8I/97/9v8h/wD/AP8A/wD/Cv/f//v/Kv8A/wD/AP8r//v/0/8E/wD/AP8A/wD/AP8A/7f/lP8A/wD/AP8A/wD/AP8A/wD/AP8I/3T/zf/z//b/1P9//wz/AP8A/wD/AP8A/wD//P///////P/k/6D/Hv8A/wD/AP8A/wD/WP///4j/AP8A/wD/AP8o////uP8A/wD/AP8A/zz/////////+P/Z/4P/Cf8A/wD/AP8A/wD/if///13/AP8A/wD/Rv///9r/AP8A/wD/AP+6////J/8A/wD/AP8A/wD/AP8A/wD/wf/5////V/8A/wD/AP8A/wD/AP8A/wD/vP///6j/nP+c/5z/cP8A/wD/AP8A/wz/+//Z/wD/AP8A/0r//////1//AP8A/wD/tv///yj/AP8A/wD/AP8A/yf/5////+D/rP+3//X///+j/wD/AP8A/wD/AP8A/zz////Z/5j/nv/F/////f86/wD/AP8A/wD/vP///6X/mP+q/+z///+4/wD/AP8A/wD/AP8O/+3/9P8V/wD/AP8b//f/5/8J/wD/AP8A/wD//P/z/5z/nP+c/5z/Sf8A/wD/AP8A/wD/AP8A/wv/9f/5//3/Gv8A/wD/AP8A/wD/AP8A/7z///8g/wD/AP8A/wD/AP8A/wD/AP8A/xr/8v/r/xD/AP8A/3z///97/wD/AP8A/wD/AP8A/0z///+7/wD/AP8A/7v//v88/wD/AP8A/wD/AP8A/xP/+v+U/wD/AP8A/wD/AP8A/wD/AP8J/8X////v/7P/rv/o////0v8R/wD/AP8A/wD/AP/8//P/mP+j/9r////j/w//AP8A/wD/AP9Y////iP8A/wD/AP8A/yj///+4/wD/AP8A/wD/PP///9n/mP+r/+z///+z/wD/AP8A/wD/AP9J////mf8A/wD/AP+K//////8f/wD/AP8D//L/5/8A/wD/AP8A/wD/AP8A/wD/Hv/+/5b/9v+y/wD/AP8A/wD/AP8A/wD/AP+8////IP8A/wD/AP8A/wD/AP8A/wD/AP/J////Fv8A/wD/jv/7/+7/pP8A/wD/Af/v/+f/AP8A/wD/AP8A/wD/yP///43/A/8A/wD/G//Y////Xv8A/wD/AP8A/wD/PP///6D/AP8A/wD/jP///43/AP8A/wD/AP+8////IP8A/wD/Fv/1////Dv8A/wD/AP8A/wD/eP///4z/AP8A/5X///9s/wD/AP8A/wD/AP/8/+D/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/Xf///43///9y/wD/AP8A/wD/AP8A/wD/vP///yD/AP8A/wD/AP8A/wD/AP8A/wD/AP9v////kP8A/xz/9P/X/wb/AP8A/wD/AP8A/wD/AP+v////UP8A/1H///+d/wD/AP8A/wD/AP8A/zv/4////////////wz/AP8A/wD/AP8A/4j////B/w//AP8A/wj/q////57/AP8A/wD/AP8A//z/4P8A/wD/A/+3////av8A/wD/AP8A/1j///+I/wD/AP8A/wD/KP///7j/AP8A/wD/AP88////oP8A/wD/E//m////Kv8A/wD/AP8A/wz/+//V/wD/AP8A/87/6f///2T/AP8A/zH///+o/wD/AP8A/wD/AP8A/wD/AP94////R/+w//r/E/8A/wD/AP8A/wD/AP8A/7z///8g/wD/AP8A/wD/AP8A/wD/AP8A/4n///9R/wD/AP/S/8//u//o/wH/AP8t////qP8A/wD/AP8A/wD/Mv///93/A/8A/wD/AP8A/0X////K/wD/AP8A/wD/AP88////oP8A/wD/AP9i////i/8A/wD/AP8A/7z///8g/wD/AP8A/+L///8M/wD/AP8A/wD/AP8L/+n/9v8Y/x3/+f/h/wb/AP8A/wD/AP8A//z/4P8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP+4//r/Ef/s/83/AP8A/wD/AP8A/wD/AP+8////IP8A/wD/AP8A/wD/AP8A/wD/AP8A/wP/z//7/yr/pv///0H/AP8A/wD/AP8A/wD/AP8A/x3/9P/d/w//3v/s/xP/AP8A/wD/AP8A/wD/L/+T////wf9s/2z/Bf8A/wD/AP8A/wP/7//+/yL/AP8A/wD/AP8Q//X/+v8Q/wD/AP8A/wD//P/g/wD/AP8A/2T///+N/wD/AP8A/wD/WP///4j/AP8A/wD/AP8o////uP8A/wD/AP8A/zz///+g/wD/AP8A/6T///9N/wD/AP8A/wD/AP/J//7/Ev8A/xP//v+T//b/qv8A/wD/bf///2j/AP8A/wD/AP8A/wD/AP8A/9P/8P8G/1z///9o/wD/AP8A/wD/AP8A/wD/vP///yD/AP8A/wD/AP8A/wD/AP8A/wD/Sf///43/AP8W//7/lv+B////L/8A/2j///9p/wD/AP8A/wD/AP9s////k/8A/wD/AP8A/wD/Av/1//z/Cf8A/wD/AP8A/zz///+g/wD/BP8p/8r//f85/wD/AP8A/wD/vP///yD/AP8P/2n///+3/wD/AP8A/wD/AP8A/wD/cv///5D/mf///2T/AP8A/wD/AP8A/wD//P/g/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8W//z/t/8A/5z///8o/wD/AP8A/wD/AP8A/7z///8g/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP83//3/1v///6L/AP8A/wD/AP8A/wD/AP8A/wD/AP91////1f///2L/AP8A/wD/AP8A/wD/AP8A/0T///+U/wD/AP8A/wD/AP8A/wD/LP///9P/AP8A/wD/AP8A/wD/uP///0X/AP8A/wD/AP/8/+D/AP8A/wD/ff///33/AP8A/wD/AP9Y////iP8A/wD/AP8A/yj///+4/wD/AP8A/wD/PP///6D/AP8A/wD/vf///z3/AP8A/wD/AP8A/4n///9N/wD/Vv///1b/wf/t/wL/AP+o////Kf8A/wD/AP8A/wD/AP8A/y////+i/wD/Dv/4/8P/AP8A/wD/AP8A/wD/AP+8//////////////9w/wD/AP8A/wD/AP8M//v/yf8A/1r///9V/z////90/wD/pP///yn/AP8A/wD/AP8A/4T///92/wD/AP8A/wD/AP8A/9v///8f/wD/AP8A/wD/PP//////////////6v9L/wD/AP8A/wD/AP+8//////////////+o/w7/AP8A/wD/AP8A/wD/AP8I/+X/9//6/9v/BP8A/wD/AP8A/wD/AP/8//////////////8w/wD/AP8A/wD/AP8A/2////9i/wD/R////4P/AP8A/wD/AP8A/wD/vP///yD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/n/////T/Fv8A/wD/AP8A/wD/AP8A/wD/AP8A/wT/2////8n/Af8A/wD/AP8A/wD/AP8A/wD/RP///5T/AP8A/wD/AP8A/wD/AP9E////tv8A/wD/AP8A/wD/AP+b////X/8A/wD/AP8A//z/4P8A/xH/Uf/u////Mf8A/wD/AP8A/1j///+I/wD/AP8A/wD/KP///7j/AP8A/wD/AP88////oP8B/xn/d////+j/B/8A/wD/AP8A/wD/SP///4n/AP+a//7/Fv9/////NP8A/+P/6P8A/wD/AP8A/wD/AP8A/wD/iv///07/AP8A/7L//v8g/wD/AP8A/wD/AP8A/7z///+l/5j/mP+Y/0L/AP8A/wD/AP8A/wD/yf/6/wr/nf/9/xP/Bf/z/7n/AP/f/+n/AP8A/wD/AP8A/wD/hP///3X/AP8A/wD/AP8A/wD/2////x7/AP8A/wD/AP88////1P+M/4//rv/5/+j/Nf8A/wD/AP8A/7z///+a/4z/mf/X////nv8A/wD/AP8A/wD/AP8A/wD/a///////W/8A/wD/AP8A/wD/AP8A//z/8/+Y/5j/mP+Y/xz/AP8A/wD/AP8A/wD/yv/7/xL/AP8E/+3/3v8A/wD/AP8A/wD/AP+8////IP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/Bf/W//////9B/wD/AP8A/wD/AP8A/wD/AP8A/wD/JP/4////7P8U/wD/AP8A/wD/AP8A/wD/AP9E////lP8A/wD/AP8A/wD/AP8A/0T///+1/wD/AP8A/wD/AP8A/5v///9e/wD/AP8A/wD//P////////////3/df8A/wD/AP8A/wD/WP///4j/AP8A/wD/AP8o////uP8A/wD/AP8A/zz//////////////+//Qv8A/wD/AP8A/wD/AP8M//v/xf8A/93/0f8A/zn///95/x////+p/wD/AP8A/wD/AP8A/wD/Af/j/////////////////3n/AP8A/wD/AP8A/wD/vP///yD/AP8A/wD/AP8A/wD/AP8A/wD/AP+J////Pf/d/83/AP8A/7T/9f8e////qv8A/wD/AP8A/wD/AP9r////k/8A/wD/AP8A/wD/Av/1//z/Cf8A/wD/AP8A/zz///+g/wD/AP8A/0r////C/wD/AP8A/wD/vP///yD/AP8A/wP/x////0L/AP8A/wD/AP8A/wD/AP8G//j/8f8C/wD/AP8A/wD/AP8A/wD//P/g/wD/AP8A/wD/AP8A/wD/AP8A/wD/Jf///////////////////zn/AP8A/wD/AP8A/7z///8g/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP95////jf/3/9j/B/8A/wD/AP8A/wD/AP8A/wD/AP+4//3/h////5//AP8A/wD/AP8A/wD/AP8A/0T///+U/wD/AP8A/wD/AP8A/wD/K////9P/AP8A/wD/AP8A/wD/uP///0X/AP8A/wD/AP/8//P/nP+V/3X/Jv8A/wD/AP8A/wD/AP9W////jP8A/wD/AP8A/yz///+2/wD/AP8A/wD/PP///9r/m/+R/2b/E/8A/wD/AP8A/wD/AP8A/wD/yf/4/yL///+N/wD/A//w/7r/Wf///2r/AP8A/wD/AP8A/wD/AP9B////1f+k/6T/pP+k//3/1P8A/wD/AP8A/wD/AP+8////IP8A/wD/AP8A/wD/AP8A/wD/AP8A/0r///+E////if8A/wD/b////4H///9q/wD/AP8A/wD/AP8A/zH////c/wP/AP8A/wD/AP9E////yv8A/wD/AP8A/wD/PP///6D/AP8A/wD/D////+v/AP8A/wD/AP+8////IP8A/wD/AP+P////a/8A/wD/AP8A/wD/AP8A/wD/9P/s/wD/AP8A/wD/AP8A/wD/AP/8/+D/AP8A/wD/AP8A/wD/AP8A/wD/AP+B////vv+k/6T/pP+5////lP8A/wD/AP8A/wD/vP///yD/AP8A/wD/AP8A/wD/AP8A/wD/AP8f//X/0/8E/4L///9+/wD/AP8A/wD/AP8A/wD/AP9V////l/8A/8H///8//wD/AP8A/wD/AP8A/wD/Of///6P/AP8A/wD/AP8A/wD/AP8C/+7//v8h/wD/AP8A/wD/D//0//n/EP8A/wD/AP8A//z/4P8A/wD/AP8A/wD/AP8A/wD/AP8A/0T///+q/wD/AP8A/wD/Tv///5//AP8A/wD/AP88////oP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP+K////g////0n/AP8A/6//8P+R////Kv8A/wD/AP8A/wD/AP8A/5z///9O/wD/AP8A/wD/wf///y//AP8A/wD/AP8A/7z///8g/wD/AP8A/wD/AP8A/wD/AP8A/wD/Dv/8/9n///9F/wD/AP8p////2f///yr/AP8A/wD/AP8A/wD/AP/H////if8C/wD/AP8Z/9b///9d/wD/AP8A/wD/AP88////oP8A/wD/AP9Y////0f8A/wD/AP8A/7z///8g/wD/AP8G/9H///9R/wD/AP8A/wD/AP8A/wD/AP/0/+z/AP8A/wD/AP8A/wD/AP8A//z/4P8A/wD/AP8A/wD/AP8A/wD/AP8A/9v/+/8T/wD/AP8A/wv/9f/r/wT/AP8A/wD/AP+8////IP8A/wD/AP8A/wD/AP8A/wD/AP8A/7L///9B/wD/Cv/i//j/Jf8A/wD/AP8A/wD/AP8M/+T/7f8T/wD/MP/9/9f/Bv8A/wD/AP8A/wD/AP8Q//X/+P+W/6H/F/8A/wD/AP8A/wD/h////77/Df8A/wD/B/+o////nf8A/wD/AP8A/wD//P/g/wD/AP8A/wD/AP8A/wD/AP8A/wD/Df/0//f/K/8A/wD/Cv/A////WP8A/wD/AP8A/zz///+g/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/0v////Z//n/C/8A/wD/af///9n/6v8A/wD/AP8A/wD/AP8A/wf/7//x/wf/AP8A/wD/AP9q////iv8A/wD/AP8A/wD/vP///6z/oP+g/6D/c/8A/wD/AP8A/wD/AP8A/8v////4/wn/AP8A/wD/5P///+r/AP8A/wD/AP8A/wD/AP8A/yf/6P///9z/p/+z//T///+i/wD/AP8A/wD/AP8A/zz////a/5z/nv+7//3///9d/wD/AP8A/wD/vP///6j/nP+n/+L////W/wf/AP8A/wD/AP8A/wD/AP8A//T/7P8A/wD/AP8A/wD/AP8A/wD//P/0/6D/oP+g/6D/S/8A/wD/AP8A/zf///+4/wD/AP8A/wD/AP+q////Sv8A/wD/AP8A/7z///+v/6T/pP+k/57/AP8A/wD/AP8A/03///+p/wD/AP8A/1j///+8/wD/AP8A/wD/AP8A/47///9p/wD/AP8A/5j///98/wD/AP8A/wD/AP8A/wD/VP/c//j/2v8W/wD/AP8A/wD/AP8J/8b////t/67/qv/l////0v8R/wD/AP8A/wD/AP/8/+D/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/2/////4/7n/rf/k////u/8D/wD/AP8A/wD/PP///6D/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/Dv/8////wf8A/wD/AP8k//////+r/wD/AP8A/wD/AP8A/wD/Uv///6L/AP8A/wD/AP8A/xb//P/j/wL/AP8A/wD/AP+8//////////////+4/wD/AP8A/wD/AP8A/wD/jP///73/AP8A/wD/AP+f////q/8A/wD/AP8A/wD/AP8A/wD/AP8Z/5H/3P/5//L/xP9g/wH/AP8A/wD/AP8A/wD/PP///////////+z/wP9K/wD/AP8A/wD/AP+8//////////n/2/+O/xP/AP8A/wD/AP8A/wD/AP8A/wD/9P/s/wD/AP8A/wD/AP8A/wD/AP/8//////////////94/wD/AP8A/wD/kv///2L/AP8A/wD/AP8A/1P///+m/wD/AP8A/wD/vP//////////////+P8A/wD/AP8A/wn/3//1/x3/AP8A/wD/AP/C////XP8A/wD/AP8A/y3/+//Q/wP/AP8A/wD/FP/u//f/JP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/CP91/87/9f/3/9T/gP8M/wD/AP8A/wD/AP8A//z/4P8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP9T/8T/9P/2/9T/ef8F/wD/AP8A/wD/AP88////oP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/8z///99/wD/AP8A/wD/3v///2v/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/xX/+v/o/wP/AP8A/wD/0////yX/AP8A/wD/AP88////oP8A/wD/AP8A/zz//////1T/AP8A/wD/AP9w////SP8A/wD/AP8A/7z/////////8v/K/3f/C/8A/wD/AP8A/wD/AP+E//////////////////////8Q/wD/AP8A/wD/Pv///8f/AP8A/wD/AP9R////tf8A/wD/AP8A//z/4P8A/wD/AP8A//z/4P8A/wD/AP8A/wD/AP8A/wD/AP/8///////9//D/yP9r/wH/AP8A/wD/AP8A/0T//////////////////////1D/AP8A/wD/AP8A/wT/ev/b//v/////////3P8A/wD/AP8A/3D///9o/wD/AP8A/wD/AP8A/wD/AP8A/wD//P///87/AP8A/wD/AP8A/xH/+v///8T/AP8A/wD/AP8w////bP+L/+n/9/++/yn/AP8A/wD/AP8A/1n/9f9S/wD/AP8A/wD/AP8A/zj/xP/2/+n/kv8K/wD/AP8A/wD/AP8A/yT/x//x/6z/Df8A/wD/AP+4/8v/AP8A/wD/AP8A/wD/AP8A/1b/wv/z/+3/tv8t/wD/AP8A/wD/AP8U/4j/1//4/+v/uf85/wD/AP8A/wD/AP+8////IP8A/wD/AP8A//D/6P8A/wD/AP8A/wD/AP8A/wD/AP+t////RP8A/wD/J////8j/AP8A/wD/AP8A/zz///+g/wD/AP8A/wD/PP//////4/8M/wD/AP8A/3D///9I/wD/AP8A/wD/vP///6X/mP+q/+f////U/xj/AP8A/wD/AP8A/1T/pP+k/7L////k/6T/pP+k/wr/AP8A/wD/AP8A/7v///9K/wD/AP8B/9H//v8y/wD/AP8A/wD//P/g/wD/AP8A/wD//P/g/wD/AP8A/wD/AP8A/wD/AP8A//z/8/+Y/5v/tf/4////eP8A/wD/AP8A/wD/K/+k/6T/pP/3//v/pP+k/6T/M/8A/wD/AP8A/wD/ev///5P/P/+d////tf88/wD/AP8A/wD/cP///2j/AP8A/wD/AP8A/wD/AP8A/wD/AP/8//////8j/wD/AP8A/wD/ZP//////xP8A/wD/AP8A/zD////2/8T/bv+X//7/4P8F/wD/AP8A/wD/Zf///17/AP8A/wD/AP8A/yP/8//3/6T/w////6j/AP8A/wD/AP8A/wD/uP/g/2j/9f+H/wD/AP8+////RP8A/wD/AP8A/wD/AP8A/3b////s/7L/uP///+z/Gf8A/wD/AP8A/4n////N/6D/s//9//X/J/8A/wD/AP8A/7z///8g/wD/AP8A/wD/8P/o/wD/AP8A/wD/AP8A/wD/AP8A/0r///+c/wD/AP97////bP8A/wD/AP8A/wD/PP///6D/AP8A/wD/AP88////4f///4r/AP8A/wD/cP///0j/AP8A/wD/AP+8////IP8A/wD/Bv+Z////t/8A/wD/AP8A/wD/AP8A/wD/KP///7T/AP8A/wD/AP8A/wD/AP8A/wD/OP///8v/AP8A/1X///+s/wD/AP8A/wD/AP/8/+D/AP8A/wD/AP/8/+D/AP8A/wD/AP8A/wD/AP8A/wD//P/g/wD/AP8A/0z////N/wD/AP8A/wD/AP8A/wD/AP8A/+j/9P8A/wD/AP8A/wD/AP8A/wD/AP/R//H/A/8A/wj//P/B/wD/AP8A/wD/AP9w////Z/8A/wD/AP8A/wD/AP8A/wD/AP8A//z/yv///3j/AP8A/wD/AP+7/+z/8//E/wD/AP8A/wD/MP///+v/CP8A/wD/nP///1v/AP8A/wD/AP8A/wr/AP8A/wD/AP8A/wD/k////1//AP8B/77///8q/wD/AP8A/wD/Af/6/4f/AP+s/9T/AP8A/8X/vv8A/wD/AP8A/wD/AP8A/wD/E/+F/wv/AP8A/4j///9q/wD/AP8A/wD/Cf87/wD/AP8A/4X///9x/wD/AP8A/wD/vP///yD/AP8A/wD/AP/w/+j/AP8A/wD/AP8A/wD/AP8A/wD/A//k/+7/Bv8A/8//+v8U/wD/AP8A/wD/AP88////oP8A/wD/AP8A/zz///9y/+3/+v8q/wD/AP9w////SP8A/wD/AP8A/7z///8g/wD/AP8A/wX/3////yz/AP8A/wD/AP8A/wD/AP8o////tP8A/wD/AP8A/wD/AP8A/wD/AP8A/7X///9O/wL/1P/9/yr/AP8A/wD/AP8A//z/4P8A/wD/AP8A//z/4P8A/wD/AP8A/wD/AP8A/wD/AP/8/+D/AP8A/wD/Iv///8v/AP8A/wD/AP8A/wD/AP8A/wD/6P/0/wD/AP8A/wD/AP8A/wD/AP8A/+D/6P8A/wD/Af/3/8n/AP8A/wD/AP8A/3D///9v/6L/8v/w/6D/Dv8A/wD/AP8A/wD//P+k/9v/zf8A/wD/AP8W//z/l//4/8T/AP8A/wD/AP8w////t/8A/wD/AP9S////if8A/wD/AP8A/3D///9o/wD/AP8A/wD/AP/X//v/CP8A/wD/Yv///3T/AP8A/wD/AP8R////c/8A/5T/7P8A/03///83/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/Wf///4P/AP8A/wD/AP8A/wD/AP8A/wD/bf///2b/AP8A/wD/AP+8////IP8A/wD/AP8A//D/6P8A/wD/AP8A/wD/AP8A/wD/AP8A/4X///9N/yP///+y/wD/AP8A/wD/AP8A/zz///+g/wD/AP8A/wD/PP///2z/a////77/AP8A/3D///9I/wD/AP8A/wD/vP///yD/AP8A/wD/AP+S////av8A/wD/AP8A/wD/AP8A/yj///+0/wD/AP8A/wD/AP8A/wD/AP8A/wD/Mv///8//Wv///6T/AP8A/wD/AP8A/wD//P/g/wD/AP8A/wD//P/g/wD/AP8A/wD/AP8A/wD/AP8A//z/4P8A/wH/Gf+d////d/8A/wD/AP8A/wD/AP8A/wD/AP/o//T/AP8A/wD/AP8A/wD/AP8A/wD/m////2D/Cv9q////g/8A/wD/AP8A/wD/cP////D/yP+U/9T///+m/wD/AP8A/wD/AP/8/63/h////yL/AP8A/2r///89////xP8A/wD/AP8A/zD///+s/wD/AP8A/0L///+g/wD/AP8A/wD/cP///2j/AP8A/wD/AP8B//r/3f8A/wD/AP86////nP8A/wD/AP8A/wP//P9+/wD/ov/c/wL/0f+v/wD/BP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP+S////U/8A/wD/AP8A/wD/AP8A/w7/R//k/97/Dv8A/wD/AP8A/7z///8g/wD/AP8A/wD/8P/o/wD/AP8A/wD/AP8A/wD/AP8A/wD/I//+/53/dv///1b/AP8A/wD/AP8A/wD/PP///6D/AP8A/wD/AP88////cv8D/9H///9Z/wD/cP///0j/AP8A/wD/AP+8////IP8A/wD/AP8A/3P///+E/wD/AP8A/wD/AP8A/wD/KP///7T/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/67////y//v/JP8A/wD/AP8A/wD/AP/8/+D/AP8A/wD/AP/8/+D/AP8A/wD/AP8A/wD/AP8A/wD//P////////////v/ef8B/wD/AP8A/wD/AP8A/wD/AP8A/+j/9P8A/wD/AP8A/wD/AP8A/wD/AP8Q/8r///////3/nv8H/wD/AP8A/wD/AP9w////x/8C/wD/Cf/h//3/Hv8A/wD/AP8A//z/sf8z////d/8A/wD/wv/h/wf////E/wD/AP8A/wD/MP///8L/AP8A/wD/W////4j/AP8A/wD/AP9w////aP8A/wD/AP8A/wv////P/wD/AP8A/yz///+t/wD/AP8A/wD/AP/I/8f/J//l/6f/W//9/y7/m//1/+r/U/8A/wD/AP8A/wD/AP8A/wD/AP8p//j/3P8F/wD/AP8A/wD/AP8U/////////7L/Fv8A/wD/AP8A/wD/vP///yD/AP8A/wD/AP/w/+j/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/8D/3/+8//D/CP8A/wD/AP8A/wD/AP88////oP8A/wD/AP8A/zz///90/wD/P////+b/Df9u////SP8A/wD/AP8A/7z///8g/wD/AP8A/wD/df///4D/AP8A/wD/AP8A/wD/AP8o////tP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/Lf/+////m/8A/wD/AP8A/wD/AP8A//z/4P8A/wD/AP8A//z/4P8A/wD/AP8A/wD/AP8A/wD/AP/8//H/jP+M/6H/6//5/2T/AP8A/wD/AP8A/wD/AP8A/wD/6P/0/wD/AP8A/wD/AP8A/wD/AP8A/0D/+v9V/yj/Cf8A/wD/AP8A/wD/AP8A/3D///9+/wD/AP8A/5b///9J/wD/AP8A/wD//P+z/wD/3f/M/wD/G//+/4j/CP///8T/AP8A/wD/AP8w////+f8b/wD/Af+2////V/8A/wD/AP8A/3D///9o/wD/AP8A/wD/C////87/AP8A/wD/K////67/AP8A/wD/AP8A/z7/8////+f/L//c/6H/Uf///yz/d//y/w//AP8A/wD/AP8A/wD/AP8V/9r/+P84/wD/AP8A/wD/AP8A/wr/iP+V/77//f/X/yP/AP8A/wD/AP+8////IP8A/wD/AP8A//D/6P8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/Xv////v/nP8A/wD/AP8A/wD/AP8A/zz///+g/wD/AP8A/wD/PP///3T/AP8A/6j///+O/2j///9I/wD/AP8A/wD/vP///yD/AP8A/wD/AP+Z////Y/8A/wD/AP8A/wD/AP8A/yj///+0/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/77///8z/wD/AP8A/wD/AP8A/wD//P/g/wD/AP8A/wD//P/g/wD/AP8A/wD/AP8A/wD/AP8A//z/4P8A/wD/AP8Y//L/9v8M/wD/AP8A/wD/AP8A/wD/AP/o//T/AP8A/wD/AP8A/wD/AP8A/wD/Yf///7j/mP+X/4P/O/8A/wD/AP8A/wD/cP///2z/AP8A/wD/gv///2D/AP8A/wD/AP/8/7T/AP+J////Iv9x////Lv8I////xP8A/wD/AP8A/zD////1/+T/l/+/////3P8E/wD/AP8A/wD/cP///2j/AP8A/wD/AP8B//n/3P8A/wD/AP86////nv8A/wD/AP8A/wD/AP8O/zL/Cf9p//n/If+P/+z/AP8u////SP8A/wD/AP8A/wD/AP8N/8v/+/9S/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP9j////qv8A/wD/AP8A/7z///8g/wD/AP8A/wD/8P/o/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8K//H///9A/wD/AP8A/wD/AP8A/wD/PP///6D/AP8A/wD/AP88////dP8A/wD/HP/1//v/i////0j/AP8A/wD/AP+8////IP8A/wD/AP8L/+n//v8i/wD/AP8A/wD/AP8A/wD/KP///7T/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/tP///yz/AP8A/wD/AP8A/wD/AP/8/+D/AP8A/wD/AP/8/+D/AP8A/wD/AP8A/wD/AP8A/wD//P/g/wD/AP8A/wD/z////yv/AP8A/wD/AP8A/wD/AP8A/+j/9P8A/wD/AP8A/wD/AP8A/wD/AP9F/+7//////////////1n/AP8A/wD/AP9w////gP8A/wD/AP+Y////SP8A/wD/AP8A//z/tP8A/zX///92/8n/0/8A/wj////E/wD/AP8A/wD/MP///57/h//p//f/u/8l/wD/AP8A/wD/AP9w////aP8A/wD/AP8A/wD/0v/6/wf/AP8A/1////95/wD/AP8A/wD/AP8A/wD/AP8J/+b/k/8A/6H/4/8A/yT///9c/wD/AP8A/wD/AP8K/8L//P9X/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/yH////U/wD/AP8A/wD/vP///yD/AP8A/wD/AP/w/+j/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wf/7v/h/wH/AP8A/wD/AP8A/wD/AP88////oP8A/wD/AP8A/zz///90/wD/AP8A/3z////3////SP8A/wD/AP8A/7z///8g/wD/AP8Q/7H///+n/wD/AP8A/wD/AP8A/wD/AP8o////tP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP+0////LP8A/wD/AP8A/wD/AP8A//z/4P8A/wD/AP8A//z/4P8A/wD/AP8A/wD/AP8A/wD/AP/8/+D/AP8A/wD/If/2//7/E/8A/wD/AP8A/wD/AP8A/wD/6P/0/wD/AP8A/wD/AP8A/wD/AP9D//7/hv8L/wD/Bv88//3/s/8A/wD/AP8A/3D////O/wP/AP8L/+T//P8b/wD/AP8A/wD//P+0/wD/AP/f/+D///95/wD/CP///8T/AP8A/wD/AP8w////p/8A/wD/AP8A/wD/AP8A/wD/AP8A/3D///9o/wD/AP8A/wD/AP+K////W/8A/wD/uf///zP/AP8A/wD/AP8A/wD/AP8A/3f/9f8Y/wD/i//1/wL/Pv///0f/AP8A/wD/AP8H/7v//P9Z/wD/AP8A/wD/AP8A/wD/AP8h/wD/AP8A/wD/af///7P/AP8A/wD/AP+8////IP8A/wD/AP8A//D/6P8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/bP///3z/AP8A/wD/AP8A/wD/AP8A/zz///+g/wD/AP8A/wD/PP///3T/AP8A/wD/B//d//////9I/wD/AP8A/wD/vP///6j/nv+2//L////H/w//AP8A/wD/AP8A/wD/AP8A/yj///+0/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/7T///8s/wD/AP8A/wD/AP8A/wD//P/g/wD/AP8A/wD//P/0/6T/pP+k/6T/df8A/wD/AP8A//z/8/+c/5z/r//y////nf8A/wD/AP8A/wD/AP8A/wD/AP/o//T/AP8A/wD/AP8A/wD/AP8A/4T///8i/wD/AP8A/xX/+/+q/wD/AP8A/wD/cP////P/zP+U/9T///+g/wD/AP8A/wD/AP/8/7T/AP8A/4v////+/yD/AP8I////xP8A/wD/AP8A/zD///+o/wD/AP8A/wD/AP8A/wD/AP8A/wD/cP///2j/AP8A/wD/AP8A/xr/7f/2/5//vv///7b/AP8A/wD/AP8A/wD/AP8A/w//7v+F/wD/AP9D////gv+3//P/D/8A/wD/AP8A/6P////m/7D/sP+w/7D/p/8A/wD/AP8A/9T/0/+h/5D/t//9//n/Ov8A/wD/AP8A/7z///8g/wD/AP8A/wD/8P/o/wD/AP8A/wD/AP8A/wD/AP8A/4b/of/6/+H/EP8A/wD/AP8A/wD/AP8A/wD/PP///6D/AP8A/wD/AP88////dP8A/wD/AP8A/0///////0j/AP8A/wD/AP+8///////9/+z/v/9m/wX/AP8A/wD/AP8A/wD/AP8A/wD/KP///7T/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/tP///yz/AP8A/wD/AP8A/wD/AP/8/+D/AP8A/wD/AP/8//////////////+4/wD/AP8A/wD//P/////////z/9D/bf8F/wD/AP8A/wD/AP8A/wD/AP8A/+j/9P8A/wD/AP8A/wD/AP8A/wD/Sf///8D/XP9U/3X/2f/5/zz/AP8A/wD/AP9w//7/LP+q//T/8P+d/wz/AP8A/wD/AP8A//z/tP8A/wD/Nv///8X/AP8A/wj////E/wD/AP8A/wD/MP///6j/AP8A/wD/AP8A/wD/AP8A/wD/AP9w////aP8A/wD/AP8A/wD/AP8w/8D/9//s/5r/D/8A/wD/AP8A/wD/AP8A/wD/hf/v/xD/AP8A/wD/gv/s/97/Uf8A/wD/AP8A/wD/zP/////////////////0/wD/AP8A/wD/bP/J/+z/+P/d/6X/LP8A/wD/AP8A/wD/vP///yD/AP8A/wD/AP/w/+j/AP8A/wD/AP8A/wD/AP8A/wD/1P/0/7j/Jv8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/1//zP/y//r/4/+n/zH/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8w////qP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/Lv+4/+3///////////9c/wD/AP8A/wD//P///////f/s/7r/WP8B/wD/AP8A/wD/AP8A//D/6P8A/wD/AP8A/wD/AP8A/wD/AP8A/zz/////////+//k/6j/N/8A/wD/AP8A/wD/AP8A/zz/p//d//f/3P96/wL/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/Ef/o/+P/T/9T/+r//P9h/xT/AP8A/wD/AP/8//P/mP+a/7X/9P///6n/Av8A/wD/AP8A/wD/8P/o/wD/AP8A/wD/AP8A/wD/AP8A/wD/PP///9n/mP+e/8L//f/9/27/AP8A/wD/AP8A/wD/mf/0/7j/nf/a////eP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP9R////dP8A/wD/hP///0H/AP8A/wD/AP8A//z/4P8A/wD/AP8W/8n///93/wD/AP8A/wD/AP/w/+f/AP8A/wD/AP8A/wD/AP8A/wD/AP88////oP8A/wD/AP80/+v//f85/wD/AP8A/wD/AP8U/w//AP8A/w7/+P/J/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/2D///9o/wD/AP94////Sf8A/wD/AP8A/wD//P/g/wD/AP8A/wD/Jv/+/+r/Av8A/wD/AP8A//D/4P9Q/9f/+f/V/03/AP8A/wD/AP8A/zz///+g/wD/AP8A/wD/ZP///6z/AP8A/wD/AP8A/wD/AP8A/wD/Df/5/8H/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/IP/7/8r/Gv8c/9L/7/8T/wD/AP8A/wD/AP/8/+D/AP8A/wD/AP8A/9L///8q/wD/AP8A/wD/8P/0/+//nv+j//v//P8p/wD/AP8A/wD/PP///6D/AP8A/wD/AP8T////6v8A/wD/AP8A/wD/AP8A/wD/CP+x////VP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/1z//v//////3v9E/wD/AP8A/wD/AP8A//z/4P8A/wD/AP8A/wD/s////0T/AP8A/wD/AP/w////Sv8A/wD/a////5v/AP8A/wD/AP88////oP8A/wD/AP8A/wD/8////wT/AP8A/wD/AP8A/wD/DP/E//3/bv8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/u//C/yn/G/8B/wD/AP8A/wD/AP8A/wD//P/g/wD/AP8A/wD/AP+1////QP8A/wD/AP8A//D/+/8C/wD/AP8W////yf8A/wD/AP8A/zz///+g/wD/AP8A/wD/AP/1//3/Av8A/wD/AP8A/wD/AP+I//7/U/8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP/h/+f/nf+Y/5H/a/8N/wD/AP8A/wD/AP/8/+D/AP8A/wD/AP8A/9n///8j/wD/AP8A/wD/8P/s/wD/AP8A/wP////g/wD/AP8A/wD/PP///6D/AP8A/wD/AP8Y////4/8A/wD/AP8A/wD/AP8A/8H/zf8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8P/6X//////////////9L/Bv8A/wD/AP8A//z/4P8A/wD/AP8A/zT////g/wD/AP8A/wD/AP/w//3/A/8A/wD/GP///8j/AP8A/wD/AP88////oP8A/wD/AP8A/3T///+g/wD/AP8A/wD/AP8A/wD/Lv8t/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/8L/4v8t/wH/AP8T/6v///8z/wD/AP8A/wD//P/g/wD/AP8A/yf/2f///2f/AP8A/wD/AP8A//D///9S/wD/AP9v////l/8A/wD/AP8A/zz///+g/wD/AP8A/0z/9f/6/y3/AP8A/wD/AP8A/wD/AP9G/0//AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wX//v+i/wD/AP8A/wD/kP///yr/AP8A/wD/AP/8//P/nP+h/8L//P///5b/AP8A/wD/AP8A/wD/8P/0//X/oP+j//v/+v8l/wD/AP8A/wD/PP///9r/nP+l/9T////5/13/AP8A/wD/AP8A/wD/AP8P//3///8k/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP/J//b/fP9R/1//nv/+/7X/AP8A/wD/AP8A//z///////r/5f+u/0f/AP8A/wD/AP8A/wD/AP/w/5T/W//b//n/0/9J/wD/AP8A/wD/AP88//////////f/2v+a/yr/AP8A/wD/AP8A/wD/AP8A/wT/0P/c/w3/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/xz/of/k//r/8v/K/3P/Bv8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wA=\"),\n\"format\": \"LumAlpha8\",\n\"height\": 256,\n\"mipmaps\": false,\n\"width\": 256\n}\n\n[sub_resource type=\"Image\" id=\"Image_vwwu5\"]\ndata = {\n\"data\": PackedByteArray(\"/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/HP////////////v/6f++/3X/D/8A/wD/AP8A/wD/AP8A/1z///+B/wb/h//m//f/Mv8A/wD/AP8A/wD/Av9q/83/9v/z/8T/U/8A/wD/AP8A/wD/AP8A/wL/Zv/G//L/9//d/5z/FP8A/wD/AP8A/wD/AP8q/4D/FP8A/wD/AP8A/wD/AP8A/wD/Af9l/8f/8v/3/9T/ev8I/wD/AP8A/wD/AP8A/wD/Bf9u/8z/7v/1/9v/ov89/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP9H/77/6//y/87/Yf8A/wD/AP8A/wD/AP8A/wD/AP8A/xz////////////////////w/wD/AP8A/wD/XP/z/8f/B/8A/wD/AP8A/xz//////+//F/8A/wD/AP8A/wD/XP///8j/AP8A/wD/AP8A/wD/Pv+a/9P/8//1/8z/Zf8A/wD/AP8A/wD/AP9c////jf84/7n/8f/2/8//X/8A/17/y//2//P/u/8y/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8c///////2//T/+f/////////r/0X/AP8A/wD/AP8A/wD/XP///6b/sf////////8c/wD/AP8A/wD/AP+m/////P/P/9X//////3f/AP8A/wD/AP8A/wD/qP///////v/3////6f8F/wD/AP8A/wD/AP8A/5b///8o/wD/AP8A/wD/AP8A/wD/AP+l///////4//L//////8b/CP8A/wD/AP8A/wD/AP+i/////v/V/9f/+P///2f/AP8A/wD/AP8A/wD/AP8A/wD/AP9U///////r/+b//////2T/AP8A/wD/AP8A/wD/AP8A/wD/HP//////+f/4//j/+P/4/+j/AP8A/wD/AP+q//////8q/wD/AP8A/wD/HP////////+l/wD/AP8A/wD/AP9c////yP8A/wD/AP8A/wD/AP+9////6//O/97//////3T/AP8A/wD/AP8A/1z////k//f/4v+4/+j//////7X////V/7n/8v///+3/Ev8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/xz//////zj/AP8A/xP/XP/e////9/81/wD/AP8A/wD/AP9c////+//9/43/OP8t/wL/AP8A/wD/AP9W////+P86/wD/AP9d////+/8f/wD/AP8A/wD/W///////fP8M/wD/Jf9B/wD/AP8A/wD/AP8A/wf/6P///yj/AP8A/wD/AP8A/wD/AP9Z/////v9o/wT/Af9H//D///+I/wD/AP8A/wD/AP8E//z///9b/wD/AP8K/1P/Cv8A/wD/AP8A/wD/AP8A/wD/AP8A/7f///+p/wP/Af+a////vv8A/wD/AP8A/wD/AP8A/wD/AP8c//////80/wD/AP8A/wD/AP8A/wD/AP8A/1H/6v+7/wX/AP8A/wD/AP8c////+///////Q/8A/wD/AP8A/1z////I/wD/AP8A/wD/AP8A/yT/Kv8A/wD/AP+I////5P8A/wD/AP8A/wD/XP//////qv8F/wD/Ef/p//////99/wD/AP8s//3///9k/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/HP//////OP8A/wD/AP8A/xP/4P///8j/AP8A/wD/AP8A/1z//////37/AP8A/wD/AP8A/wD/AP8A/7n///+b/wD/AP8A/wD/1////2v/AP8A/wD/AP+7////vf8A/wD/AP8A/wD/AP8A/wD/AP8A/0j/3v//////////////PP8A/wD/AP8A/7v///+1/wD/AP8A/wD/f////+3/Av8A/wD/AP8A/wD/8P///5r/B/8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/uP///3r/AP8A/3b///+4/wD/AP8A/wD/AP8A/wD/AP8A/xz//////zT/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/xz////e/7L////Z/wf/AP8A/wD/XP///8j/AP8A/wD/AP8A/wD/AP8A/wj/Gv8g/1j//////wf/AP8A/wD/AP9c//////8p/wD/AP8A/6P////x/wf/AP8A/wD/0P///4j/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8c//////84/wD/AP8A/wD/AP9k//////8p/wD/AP8A/wD/XP//////E/8A/wD/AP8A/wD/AP8A/wD/6////8//qP+o/6j/qP/o////iv8A/wD/AP8A/+z///94/wD/AP8A/wD/AP8A/wD/AP8A/wD/df/F///////G/7z/vP8s/wD/AP8A/wD/7f///3X/AP8A/wD/AP9A//////8k/wD/AP8A/wD/AP96///////o/4X/H/8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP9l////5P8Z/0L/7////03/AP8A/wD/AP8A/wD/AP8A/wD/HP//////NP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/HP///+7/Hf/z////f/8A/wD/AP9c////yP8A/wD/AP8A/wD/Af9u/9T//v//////////////DP8A/wD/AP8A/1z////7/wL/AP8A/wD/kP///9D/AP8A/wD/AP+8////kP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/xz//////zj/AP8A/wD/AP8A/xz//////2H/AP8A/wD/AP9c////8v8A/wD/AP8A/wD/AP8A/wD/AP/7//////////////////////+Q/wD/AP8A/wD/+////2L/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/yT//////yj/AP8A/wD/AP8A/wD/AP/6////Yv8A/wD/AP8A/yv//////zP/AP8A/wD/AP8A/wD/Vf/W///////9/5n/CP8A/wD/AP8A/wD/AP8A/wD/AP8A/wL/uP///+n////4/2f/AP8A/wD/AP8A/wD/AP8A/wD/AP8c//////80/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8c////+f8A/3D////4/yX/AP8A/1z////I/wD/AP8A/wD/AP+K/////v+l/2X/Uf98//////8M/wD/AP8A/wD/XP////H/AP8A/wD/AP+Q////wP8A/wD/AP8A/7z///+Q/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/HP//////OP8A/wD/AP8A/wD/Av/9////eP8A/wD/AP8A/1z////w/wD/AP8A/wD/AP8A/wD/AP8A/+3///9x/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP/v////d/8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/JP//////KP8A/wD/AP8A/wD/AP8A/+b///94/wD/AP8A/wD/Qf//////I/8A/wD/AP8A/wD/AP8A/wD/Qf+2//////+P/wD/AP8A/wD/AP8A/wD/AP8A/wD/Ev+q/////////0n/AP8A/wD/Jf9c/1n/AP8A/wD/AP8A/xz///////z//P/8//z//P+R/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/xz////+/wD/Av/L////u/8A/wD/XP///8j/AP8A/wD/AP8H//b///+M/wD/AP8A/0n//////wz/AP8A/wD/AP9c////8P8A/wD/AP8A/5D////A/wD/AP8A/wD/vP///5D/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8c//////84/wD/AP8A/wD/AP8D//7///9z/wD/AP8A/wD/XP////D/AP8A/wD/AP8A/wD/AP8A/wD/uf///7X/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/8P///+6/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8k//////8o/wD/AP8A/wD/AP8A/wD/r////7r/AP8A/wD/AP+C////7v8C/wD/AP8A/wD/AP8A/wD/AP8A/wD/kf///9r/AP8A/wD/AP8A/wD/AP8A/wD/G//d////5//M////4/8n/wD/AP+h////xf8A/wD/AP8A/wD/HP///////////////////5T/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/HP//////AP8A/zD//P///1r/AP9b////yP8A/wD/AP8A/xj//////07/AP8A/wD/ev//////DP8A/wD/AP8A/1z////w/wD/AP8A/wD/kP///8D/AP8A/wD/AP+8////kP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/xz//////zj/AP8A/wD/AP8A/yP//////1r/AP8A/wD/AP9c////8P8A/wD/AP8A/wD/AP8A/wD/AP9Q//////95/wT/AP8A/xj/a/8C/wD/AP8A/wD/av//////d/8L/wH/Hf91/wD/AP8A/wD/AP8A/yT//////yj/AP8A/wD/AP8A/wD/AP9I//////9y/wb/Av9K//H///+L/wD/AP8A/wD/AP8C/3H/Gf8A/wD/AP+S////yv8A/wD/AP8A/wD/AP8A/wD/AP+t////4/8b/wz/wv///+j/Lf8P//D///9p/wD/AP8A/wD/AP8c//////80/wD/AP8A/wD/AP8A/wD/AP8A/1X/7v+//wX/AP8A/wD/AP8c//////8A/wD/AP+M////6P8Q/1f////I/wD/AP8A/wD/Av/2////jP8A/wD/N//v//////8M/wD/AP8A/wD/XP////D/AP8A/wD/AP+Q////wP8A/wD/AP8A/7z///+Q/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/HP//////OP8A/wD/AP8A/wD/cv//////Hv8A/wD/AP8A/1z////w/wD/AP8A/wD/AP8A/wD/AP8A/wD/kv//////9//b/+3//////wT/AP8A/wD/AP8E/7////////3/9///////AP8A/wD/AP8A/wD/JP//////KP8A/wD/AP8A/wD/AP8A/wD/jv//////+v/0///////L/wv/AP8A/wD/AP8A/wT////+/+T/yv/j//////9b/wD/AP8A/wD/AP8A/wD/AP8B//j///91/wD/AP8L/77////t/63////m/wv/AP8A/wD/AP8A/xz//////zT/AP8A/wD/AP8A/wD/AP8A/wD/qv//////Kv8A/wD/AP8A/xz//////wD/AP8A/wr/3////5b/Tf///8j/AP8A/wD/AP8A/5X//////9n/2f/9/6z/+P///wz/AP8A/wD/AP9c////8P8A/wD/AP8A/5D////A/wD/AP8A/wD/vP///5D/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8c//////84/wD/AP8A/wD/JP/t////uP8A/wD/AP8A/wD/XP////D/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/1P/vP/v//r/5//C/3D/Af8A/wD/AP8A/wD/B/95/9L/9v/6/9z/h/8A/wD/AP8A/wD/AP8g//////8s/wD/AP8A/wD/AP8A/wD/AP8A/1X/wP/v//f/1P99/wr/AP8A/wD/AP8A/wD/Af+D/87/7P/8/+3/uv9L/wD/AP8A/wD/AP8A/wD/AP8A/wf//////3L/AP8A/wD/Cf+6/////////1T/AP8A/wD/AP8A/wD/HP//////NP8A/wD/AP8A/wD/AP8A/wD/AP9W//L/w/8G/wD/AP8A/wD/HP//////AP8A/wD/AP9J/////f95////yP8A/wD/AP8A/wD/Cf+L/+D/+f/c/3z/BP+7////DP8A/wD/AP8A/1z////w/wD/AP8A/wD/kP///8D/AP8A/wD/AP+8////kP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/xz//////zj/AP8D/yT/dP/u////8P8o/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wb//f///3X/AP8B/wf/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP/P////4P8j/wD/AP8T/5L///////j/P/8A/wD/AP8A/wD/AP8c//////80/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8c//////8A/wD/AP8A/wD/qP////P////I/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/HP//////+f/4//7/////////3/81/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP+v///////m//D/WP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/z//9/////v/1f/V//z////2/8z////1/0X/AP8A/wD/AP8A/xz//////zT/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/xz//////wD/AP8A/wD/AP8X/+7//////8j/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8c////////////9v/i/7D/Yv8I/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/xX/o//o//f/1v86/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8s/6T/5P/7//P/zv+H/x7/Bf+t////+P9L/wD/AP8A/wD/HP//////NP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/HP//////AP8A/wD/AP8A/wD/Zf//////yP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/Pv/v/8H/AP8A/wD/AP8A/1z////w/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP9x/////P8I/wD/AP8A/wD/XP////D/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/w7/eP9N/wD/AP8A/wD/AP9c////8P8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/1z////w/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP9c////8P8A/wD/AP8A/wD/XP////D/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/1z////w/wD/AP8A/wD/AP9c////8P8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/XP////D/AP8A/wD/AP8A/1z////w/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP9c////8P8A/wD/AP8A/wD/XP////D/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/1z////w/wD/AP8A/wD/AP9c////8P8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/XP////D/AP8A/wD/AP8A/1z////w/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP9c////8P8A/wD/AP8A/wD/XP////D/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/1z////w/wD/AP8A/wD/AP9c////8P8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/XP////D/AP8A/wD/AP8A/1z////w/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP9c////8P8A/wD/AP8A/wD/XP////D/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/1z////w/wD/AP8A/wD/AP9c////8P8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wA=\"),\n\"format\": \"LumAlpha8\",\n\"height\": 256,\n\"mipmaps\": false,\n\"width\": 256\n}\n\n[sub_resource type=\"FontFile\" id=\"FontFile_5froe\"]\ndata = PackedByteArray(\"d09GMgABAAAAALU4ABEAAAABjRQAALTXAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGi4bEByFbgZgAIcICIEmCY80EQwKhYN0hLMRC45WAAE2AiQDnRoEIAWHdge+AwyCGFsvXHEH67bdn6iE9GZV9QMc1odOBdvVg57b1HE2VeYCBcd1twMk7aQnBv/////ZyUIOvftw/0kEUNrVtBtkucwI5CiKKmQEnH0oCI7cFJBkSMrsGHNU8TQv69y2hp2DJxa5s9MybuujjBgMZ9k7HyQj43QedpzBD0FPOAo/vINq5SyJq9JeSt8Ex8+bAkGjtePF9Wmrg0X98IsPFv+yICXeLFZ327DfaiLHW6YgJzkLLksyBdm5xuZLaTgwssPJSdxOLB94Dqd14J0VxpgknNbXXqxnD69jIGH8jhfy1FBMyfyTqXSlTQnX3EX04Da1zZwbSg8HTDLKvAbVmj4nq8sNxbr/rXC3Pj30BO9d2G5KfVkGxi6DEm3EinNe+Jf6+/hfSXZS50HAl6d/KI8kzAR038oBr5t/byR5pGka4SlGCDsNNmCYow0pPkII8IiYH4FCmsb81B2GEREXIo1UcVDMp7gojXTlIz+OGTemFBAXXdQizlRxfOrnI2z5mvVAA2g02r9+huSQw3GSdj2/89J34myJa4PkonAVZpdueHF2/6dWVj/wIwIIIIBQiAioBBKpKkt1dld2k6xVlSuuKjldPeScp/qRhscdw+IaHsfwuIY3QpmremixTyjzzjBv+tzsXxosWBJ86RIewRM0acBD8CAttewU6IqyJna47enLrd3vN7+tnb743HXuOgB6mz/zxsy7c+68m/vn5yTnJrfkNYy8kM0ZIe/OH3knLy9UbuQ3L1EqaWKdsczNOcMvaeB1pbgACAEF5kYrVAgt0+LFfLspKGP7MqhRAvQsuX4vchEGMghorizQ8QaADzfPLNyIvPAnhP/W2ApZITswz/7aJvP0c8MRs6UUW+V8kQIQGIC51cybSMaIiBG5SBbF6LFIcmzAiB4RrXQJmIAFBtp/p14Y+WA2KHOWUsbkhPEX6i4kBv5XNQVAtUK5NLqA/qZcSoMKaOnxWgFsJwGvUpluSqnccg/nTPtnqi7TrWnD3scbk9WtuDHF3h/meCeshPBILdb6d9kuxy2OwUSx1Cca/0kr4Imjd/P/ZzYJkJldlpSn/v3+PiLYKRUKtBzxksxPwn0K7VPXyDX39622PPYEdg0hWLUEnfTFEwYPc2aS3SPJLjJKmmy8yweUAjqZ1/fge/wneC1gJUu2S+HyoPncP+Wqle8S2MyWWUIM+/t/OpvWvL0+3k2px7SyUeCACAT5tXG7BAgYeGizMyBC2r5Mg+isy865/1+pltdqAC224gIbod21zXk2n+EsjZ/vFCU5xYj+XYUCupGYJADc0AQli6I2gE1KJgEFVDXgR4DkBIVN6eQQAgjSGgiTSIDSUmkCOFGaTSFPzEfno9fnm2ac8tWH22Wf7/no/7OclVYhtaeFYR72zB1BtHiPM0iOO8g3Crr+r1JXVXcL9SEstQQGyXiEGLxCwjNCc3Uj5j2EHch4D8Z73dkEoWBu9sR7HtHshBtEu0G4Qbb+l2raYv/7ewFLXIQk51Cp6A4dy3V3VckD/w5O2P1KAJ0oK4XKrcujKtAVzpGtm9K94Km/VP/c/pe+/IEjGkvQrpU9O5GMh1sdj1rAgyEAzqXr2/ZFD+RRZRLJ9ATF1irPbZJLDokxdWsE1KSnfymGaihCaQ1l1uGgVXhcNq7jnNC/2yq1ErmOXWOGEqJiGatUVRi6k2+fbI+HraoQgSSWXQaRXOgcr3nu/oztc276oy4NSkEe8Ui527Gf1p+3uK2piRg0YokNlBlmJP6/coyphTRqOvbbKY5MByrzuAP9+p4f/zkN+/WGpWJEVERFRVXFuP0xADaGu0IODACPBUHjd9kcyb7IXhyVTmxjHFayfBseVm6A8NFYZhqQJXecPAwI4IHmXNaHEHrlYBaCFOhpMMCAgLcA2BRmQOLNnPjeRcCBCR7AAQTeAU9mMhuf2ygDWPaOfRtQ4OHFLPj4Inh432Q7sH/5mstOHQKOD1u+8yA4pT6GOefB8vgy16ATfErQ/7mbUpGfWxS48zmiwe/qk0lz7oEik+YBVpZAbHBAAQtacQjgNUAAacbeMoENs0hhLbv5kT94aigyz/JyNEKctz8Da4qdsSt2xx4QYICcYe4ywmjy02YeJGF8znZ20MRj3DxlDF7AK0Rji63KDthB7/E78WHMBwUEa47DAE0PAkxsRfyLgxe+laMwBza2KepiS9TH1miIz8IS22JzjfKK4NWxDb7qeeSNeNA6loEMJWOPlLK+I1GafBEQcIo2g1ex9Exm4c1s+DEffBl+SWxTbHvyuYBj22OHBVggCOBIiAkty+TghbQ4vzoGcIDElyBCvQQMssj1Yr9eEY2gzR47HLkeoym47ykLDP/T1TAA0prRp9/fucQAeht/CvtbLCZG4CiK/wH67HQIuAkA+wNwxBlLdfA+Af2v/CfJ5qXR1bsDsg8A0ekA2F0dAcyYDhxbe2S/yHqYkAlFFutw0Wcii7Iy+9hqbacdMLuN2bT3Hu+n/Ir3+G/+MhAMwzywd7Dg9sjjzrQl9saBOByd8VNcj1t6G89Vnor0kbZou5p0Vuf0k/rSa1fE7zTqFjVBXaOe+/3D73/+l8C3AraBFKRhCKYgDwuwBBtwBTTDWtgOa2CjjyxwK5/DB320L+RL+LbQaFAFbRa0Je2mKZqlZbqU/iR47W98qqff9DQAu5OFnP38SL+FWrRpTWc7bb/9YGM24bPrES4Ld+rAuln43GGNQ45vYsABOHesfBWrVFu1Qzs35JyC+ncFv1Opq1QpNUm5qBd+/9w+KgRsBZ0Q3oODeaFcONRUgzhuvIWgEwBN6tMjkTM7e8RdEiB5+Jjdwlm6KGsjoJpZ86ybm2dl+7ZHu7cLi1t31Y/3qm/1Ex44V739e8pz46wFVtY5Z7UXmJypjd7cPz2mfr2h7xa4d/292SPn79UAbKVHuPe8/Q9v94/PePPizvPiBiuWjGhR548ylr+4PQu2/sMUGoKLN1bo0MJCAYMx/Jvh/uHeX/8JELle8G9j4FP9KJ9pn2TBKxjx2xOzh8+Ep+K/EiqMf/EkWvkrvuRZtPEc28dLbL/xoQNczG6wVvvS2myf7Y/2+MoOWbt9ZR32tf/TP7Vx+ztskRmHo8J9o9FjPNaLvaRIvFGmw1DFdrL3BLza7SRbnqjdAM6bpLz8NoO/vrtPZ3VfTttsw5uFf4HBn+YYdg6xO3ku6+USfZzAapF09Uhg49FwRVleWlyYH8zN9nvdjtxuNRv1WlWqiOVSsZDPZTNCOpVMOCyuXrlwvh2cg7P+mWOHWm6zUa9WyqXf+TFZpEaiE/BWGIOEeHD1CpfHkr7deWkJoUEec9yQa8NgMBWGmJDxtWMgfsMMgmhqwybqhIG6/Al5spYXJgb/3sDH9OWsstDX99Ec962Trbn2INSbfd+pKAdKezklhh8kVpr+dyDNqpUe9NYr0EmySvXOV8VUvABbGb3wjPY6uyAfXaKEKL8eNO6W8RrOHAmy7/m+7m0YYgP6S1pJj/eHYqGHxRY+2sOUyQ7Prux5M3bJirlcW4O1+LVCJ36jsHWktV9h6zJehL6MfPJP7elyHa/cxiReFr46mttuSLT2G4ViPnCB2/+QGtj/jBijgjvDd0nIekjnlP8u0QshNNaqCA9t6o7Hb+cr255dsFmtZrek4UhmFNL+6Vx2PAzfaHRNQh9pCBLDuQgPzr6a9LItypO4I5cf+Rz8B57fIh3RzDIDwWIPC4Zu8X041u+MBdHersF0Vl0RL+J9Q8T1yxqZIZizN+/w4pyU8okY8MuAaF5ZzAXDVFyOUOzEmK4gj9+3UBhcNd7/+WAPtPjD65rFwdHxjj7xfBsLzAxlDHPtcwv9rXyDT9H9DHS3DvCHUKvXxa2VIE2X+EFyDNMV3uvAwWUwwmSBm0X/pl3EjuuU2Y3rzubY7K2jvlW3weuwhYeg62SQr0uO5hUtod8YD/WQmNXeHTUZXzEuLeJAFhDpBSq7S26/RXaHe9/eJneI7lMlHOkpdNp8cGptA88Ybw252eDK81FopLEGta7xoqGki38YBO8cjZnXWFDRPESzL9UDieDM+d4tF0h+Frpe1475AEtBaWKVeY5eUG7D5+FNGbpPsjVDipZk3WwBPNg6LdfD1CNlvPhHvcblep8cxtPcdd6vSr2BUCDUjjirU/V8rQfEu2JjHpeAOXUJ3MJgCXEsZr2LLOhxk+pj3t/DFayDhsSKxYzSEWBCYwtQ0PTCZcMLowI03rWQ+NFCb4NawfByTJ4zL+yeDlIdGfKuk9sSRPN2FQ+GToIsGCLx5YZ40PJyAgT2DISxchN2dZsJEdRB8ohbGYZr0nLqJ0yQV+LPvU+2bD9AIhotdI3ejBFpBnR71l2m2/PxDLsuIXx7QX3DKOuZrs7OzVhdwgUgiNV9/S3xWuCNOaDSQ+3tihWklIt6/MnqmJK5rdIOAsySuyK1zyYMyrmbgsngXEKKCt8FGYHuNFHJi5IoixqrMy+jU+obHPsTJVBGcqRG67RN0szcypimmcf1CGkaCa34vkUZyosv1Tol+EXqaqLbefWKPJZAVF5iydc8puMznVijg26dHEEW1D0UKTwjyNIpGWWFGlZgvYtV6M5PPM8+nyiQooX+EfqMTLHYm8mAhJNfKR9c5Cd+jrvvsKK+fLlH6/4b2jgggAIB7OmGBgDROaSmNFT77D8DB38DwNlvgG0/DmDTq8DTLwBo5n5CJ58ffYw5P3ITRH2CASwPBwkFAbNnshKRjFKJRwjpbXYkAuRDOFnQNdMNjKZltemFxzcNmid+NgQMCrBJoyMakehTdovsk815Ue5mQTbyGQAEpM2eR1OYfeaXABwYbLuIBy6LGk8CdEuy2CCXhOhDRBHmySUeSaLA0pAslpLGkcMeyTcXmqmYaJfo02MqloYGaLEREGbM0YQPpTK3nSxtteRA9klh6VPXL9ZsQYqMMbnNZTtKhgt/bi3O4jSQKWuiQVqM+OwKmceQTIh0EHLLroRFdF4SYFYdzkxI83RPToZgbvyRu4GXH+YO8+G00/zpz9/FdvFr0zFHjUzNzBg36wXSnTCIVrpo2KtXguwUQgsmEKDrnbqtGhezyaCsTMSr/vPOdSKTMPwCWNukAVDpIHbjBtsg3pFj8qtG5NES52fTTDC0dB1NoiH1lzlhR/IbHZmw7SsK0SuA0nXVMzdiXUcGULn2U4dBAeYVsUHROZPvO5+rdHNs4IwVkQ4KAcuedAd3u509e1vVARaoBbTP4r2HoiEAROSCzLKeOMcx7ri+jGAOV+E199gDhjzJxXK7L4uMEqESmuG216EgojNRIZV5hEnV4KRpOa9b7Xs7NzBj7ArO7mUaHORuqjK641elRadjdruMAxmLVUkvdmYah6vk5Y4gcZUOINdXV7RxDiQRKKVGJqaGWhPv4ZW3Ci5ARbM1pnMcrhNntOBZchoBNyRfMB8DvpZRBndxgvEncmz239vvq9+Hy38ZzDYwVyCZpKyK4lvsH9PwEbZQauzSMFhAhwUH53MuzmEMo4yus9KHcKw5j+04lhKs60K4OJ8gj0DoY8eAWuoUh53Dfslnz5JTKdHNpnXkyHXmceDeD4PK5E883l2dl/s0rWtOd5femwvO+np4MWFADaOZArrcqWw82XWPhcTXJEh7ifW7C8rMurA8DUGzSHBC+/Y8vgwM6AGNaTGasb4rDzgMN5kRSa4FENYKKyOduE4oLCBDJcMqrCK5qVkUOtp8nk9FSo17Ck/fWei+zX6R1MM05cnOyprE1etWYymSVLy8g3mpCaa/sPCPyBwWJ/dhflBFdVy+odbkvzinD+TApSOkkurs2cYJanKKTHGV4uA4OhiGo0E8PkoORyuNxmFlQCs6Lgv0/XFjtJAAAhKdXxvHIvM955ne3xieue8ZCzeL2gV8RYt4wf0eLRqp5Uag4eS+6wjBmspX3cfeBGGuVp7k6wT5ks0bYkkkRU4XhVusnQKorS9lV3U3alTiQeiz8dRCd/Bj2/P2GSlBjPNBqcDbbmuwSLK+dZyArS9sXQxgLSenV5VrLGrUlKU4l6qo3uQKcHsNjdSmEzeNIM7jsmpEpX3KaHMK0n5iwTyUAHb5PXwXDrzUpPv2Z/owQ4Gbt0QlJvvGd25jCuvFKwGe3VvlKMmAi6VgKCh1aF6UA8Z+fFZj8cYRm2ECxON6y/e8zrOaxnPlKPkb/456zqg7IDHp2ehTyfJSDMRcVolrltkhl5KrRra0rfMeaRG8J1CVYQ3PPZmYy2bhrYF0+N2zei2ArrIfFw2NXRXrljIF7ZC+zqJB+P5B4Gghr+uSsGs9tl1M/BgthJ1o+K9m+Aq0cZpr1Gfh4ntoYGGeFSzcsRBk9BCZPoplL3lFvoLWorulqBpaH8voxIqiAuzU8eoCs03M3wSygQkK9/W2PBBBd54Tmw0Op+4k9p7qM8FRAssY9xwij6HIKu+UmSG+xj5oaeX6DestunArN7z8RXhNGaeVWdXYHaKzzyXLP6NXrvX+PqceGIB8hX58X58t9erMnK7MUvKz1y55menvkV//kvaWFgM6NZJSFhnRaFI9dZspjUl7GEidnEbzvXIKAvTcxQ4kUdq96ztLKQyXOu5SL9gt13EhCatcL+RGZuHzR7y0tWrQvclNgH/oUnIYK7mmzCnFVCoXXw+EOyWAO3imJF3orJFHodSV44SpE9QtahMuLVgzbosRCL+Jfmd/uFnE0wemV/2zL3YSXFgXxJK5eIblElTnkPc1JNuTFkni5cvbyedR2OY9b2bjzv7KAvXF2TE71fNQIdEPjUoKrvgcMexdgJlfMoC0UV7bJCZNTdHRjDdh+Ymso7RVVJFN1EfnHe4AXTFCXi91TwlTlpRQS0Mq4RWnsEvKj+FuX/inLTVqwPWK8B86DcsQ+l/q3g7gJ5p1fyJMEgYD2g02SmoTu0r8xhN3TMZXKskNTHnd36+L9KCY6Lln2RVTc+WzZhXRKaszMxyb5amez7Rvrv7nbVs/mLjlH/EqJEHPc8941y6KgHaWcmH5UGrSXEClWkZCnQR/kQ5TVWBDWAGsr41E4e5uLZKt/GR8ExtzgLzhHUiMG3UPp9oEAhsuFmWZmV5ejAUiAYOeAAMmgDQYW9hbeYUIOXfangLiJDKepWbDiiB0DK4FV5IaEMewa8VLBs1tnVCjkR/CZyzcIqUFqdiDFLYbAoJobq3EACtMGmmqPwB1fZIwUUj4GK8C+Z2ER+AuHBzFRbqPCa60NTPI06q9WM8rwxLGv6ELINmBKDNOmwnQ6tk0XUSzk3B+/DkWchJIPrLGHeZiSCNS1DbuF7flt+5hX0IpDVyq1eieYQDnXax9ZMruYxGawwL0CY+GV3YXX43/zfBBiI09Y+A/pUXutS4h2VLuR0NLppJQ2P5LO/Wtlp+m8gUf5aWd/PF/Mk6hEg4r84y8JPnKH2F8zP401Ov27bN4MU9ODj7rc6m90jLTEGExv43GHvnUnqMHJP0a2ciMRzW05RGyV0cbD2RMwNnG7/5inpxYI5jFi7n3Qd7lXlkvFGp9+LpeyaXUJY2olzDwGRQkE8G/1+JeAOr8cxCZwT5ytMglv3CsjlByHgvwL7fJ2c5DLQWGGn5ZgpyXDI1JnBSQ4GTroO3wxbXcVnGqh0wpEXs/2oMB3HTE/nfGQJStcZavx7lc/euVvlKhlv/khdLlC1QcReq8HL7kMGdKHxOVSH6IMCpvYGCgTkkyaChOwhHkP/MJGRks8gS72dvrApEkksWjtFqVBWadVeWcwzjx2E2iA2VBkih0yWvFbU7xC+hYzui1jUlc+9zWwBLy10PpUk3KhpxzBHst00LgOaIRewb4dflClUEdhuRyYFNWU5jlTopniBd72IqAr/EaABjVpKtdCLjO1jL4hcgu+iOFQaxdoktm3/AKDNTaYC5SOlYKj7+HeFSrT+iC4NftHgPf0GIY4M0JwiRP+543IZ9sHV4KXB08IiZbhOMUlTHsp5jCWpWCcjcrCQLe4lbdCZEBE7idcmvG/Ml/+6O4hodSFim1uD2hIWMlL4tXwE7CpZYBRjsUVEvoZDyrcOhG+I4WjL/PCKQRpFQEzpqHa3RUPLfgZMpOG+rRZx26HRL1RWEKU+uf0DoePTFldeNOygLopdBDIV/FL+ozruYYgI5PlscG7HWwRsO8k8LWuSLDkTFLAtliRGAMGAtGW8ysTsVtbikKmVeZjlRCFw1cgdpJ7xlfmEbU5C4JAQ79klHQnEGa5eb/mksb4AMoJcCds1yFpzzR75IUdXnhzQ4wen287q0HVOQAKlpmFX/aug0vLR1unAUduw3MFjwozJFDohBBDu2UGEQXldibbpHfWJPFc/8yf6+Z5/ADZhhA2XBAXZZxEGRz3WxT4f6Ld3nUfSjFrRO2zrCV84VUX0jiCsOzOGICmb5UD8AX+mLl4WQ5faKJQKY499UHL4x1fSqUTNDC7REpvMlccwu7nsbdFfgCXBMwudwH+gASF+DR8Z1K8EaNHvSJMmi9jcBcjSKf1/JfM06gK+islXDc9qFonzQmAVwzPB8QosI34coQGw+cp1u+RxFWiX2WHB2CWCjpzBZZY7FHWsMVL4e9El4A0RotSUZdRvbWMG0UFx/yMO5V9IQVBlIsuQviAq4PE1Vv6sF5C5d0gFcaWW7YpYHnG7mNnSHJ7Z9rbePuyNXM3zzH1+GDTmv28O2vo8DdQEE2gU/TMof3nYo7J1qRo9Fpl8+ymW74d5nf/fjS/9OEH3kd2Q675PQUSflCWP/8vrnnsXtu7t7T913y7mp2JNNvVmKliuzOe0s9XwkYaFHjSInPE/L1o06r5m30BLIumytWpH5zWi3jj+8RqZOzV3PwaXZx/Qko6UdpJgdZ2ASRLTryDmi77gDpMpl29/PTudgRuPct1fQejM426KKtE589LOqGHWoeMY39z5Z69bSPetgJBW/5vML0gXygGYieFOVmDZMSQUm9dOk7+UN2Rpj38FbNDt9edmYYQKc7icbkn6Nb5KfkdBV53OSRbbH2qHTi3GN3xctTfeaS54cHvGpMArCKgZtgNp1VFLf/6mI65BV2xVr7YhSN8dntU1s/6DTOXMYf7sgjK69uYLpyUvvNpZjQfq1ahKC6UFmHOzXzfZkCPUFbZtRQ8oUDbtfpAw6rp5pxbqRX6nKRqFmI063f55Zts6i8k7FMPtgVlmyEGPiJRVLZkTIr1aa1NabdVfqCz8U+nzYTek6X4FDFXHpteogLQts34XSRo26NNcRwc5gYKoJOL89NnWfzPlyphbbAqh17hxwaDe5RR2/dpT0CMzkbQyWCyeqzMWEAqrPa1OnGYU+1qHB+LmATQ0dreNk4TX0xDqGr/aw7FqDHkFiHVVdP+E09xgBkRoCEUQixvKyxbZEQRlBwrD9Vqg6qM/VyaSJ+UNCR7HmSiA/j4ePMshylc6cc4OGIB8fnx3A0pHHkJqcY74/cjTQveSv3sly8IbvxzvTezVOJm8dnBYp0z/ERksUFpyOV918rwyrpAv1tOoTsO7gpXxx+evmHAoQvgi7a8shnuPpUBlK5qbB4CWvryhSovAJeqbjnglOvjvwqVBs27Y3AwQamfDzwjNj39odbtgQnkgUACrnLDLRECM6l24i9KsfJ+bTGztEZOfqTdBrsQXZ3ooUVeVt//d4+RR0UXJnOxZWEJtecAN7gYzMlT/3Xr6zrHud/C6qu5MVF0kUkFL4NeOg4zA4/EKN/Rg5iUtiTUkzs/veSsnRTkn46RMmwD7176wC8sGdfozNCc0WYKkowCejEL+8sAC/5SBUEvdnA3SU4ve/H5bK5b/4JFzOSFB/S8cmPBnFCaBKNdhzdMiYFH57kwhXcvcJ0xadLWs1nJy79ZGUopMk6D13xGp18PyYnIR3IgVGWG7DUtwkma/iMuJqeFbussQDnYijzIT6Mf70Cp0j0eETF4Z/RzY3Pwd/Mywj/eu7kAwsg3rNnpdHCkgie047u66z+RUeezHn590ru2EH/+iDQL6hNiVPQMUAgaBTh2lkAWgzSFtVFA3uSZnMpOezpdTbTVBTHuTU5jDqVGTTp3YE2VffCHzUvynh7xt+I30gAMursul1vPSV9hqgfx3SdpSEKGpFJIVLYM/gkWc3bfMDrix/swsHtEpvXVe/Qq+pana5XF8PRlIvxEbsAypfgR3ZxQleOYLn1tdp3gsZEgLRFB9Ct9NM1nxhc2ANv+XYCMeI0QVyGCHkH4dcf/hQY8SRDA23y75bqS6cCUQGOlXrnFbBN13KkbedMNdeF06CzzpUCt+9vQhxIpSYKdbayXIQU92fed0jxImDLkOJCJ4nTLoI7D801ZOO5HZSQ1f5bCRlL+4VP22hk8AZ50TEKB6J4h4fDNsesZQlnzFXr+KK1NznnygY4anZOtLZxyjHTA1byaHlb29AHrL99c/bJJY8mhvGZmYnr1R/Rs0bIE4NPN9w3D6sS83qrKlamJiXPzMPJ8mVM6ckbr88r4yHXI82Qm6ipOmCOfZghDU24AhXqbTCrvOjynC3s6AFFzqOrsbbunYo9Kz2wNCmnO6jBLdkyJWWnb/dDNjK+Bl+zHfn5f0AT0mRYgm+RFDDVZ/bBlwTDKZzIzd5S/yE5Jk4KQYUDV6smu20CxZIPPPPIXVKIbJEKeoFVl70NhvWlQZ2EINTjEdKlPcSCZG2tsz0nZ1rfhoS/fTC95Oc7mXHjEPyIye9tZ42Pw2Eg/vcQ+NhTEd271PXT1wgGPj879CqIG6fy2zXje9e4dbUc5k5kcIKfF2mv0ngjPz0OPaPbGt/VJ0YoGFvuEd7pYLys4Mt+X7JQiVo3EAH05D8rCYtYX3YkwHjL3yo8hyEwLy+JR94/XSNxVUFV3l6i2gNtTH6EJ3HxDxa3IMUN3RBSTD8LGKaxSI1unGWWoJI7RyqmdJH9KSYuMGbxW1y6VgNpO8hw1SXnzv0B+HMuGhyGR0Up4zyK//neWI7yP6wRJ/LCkDtlAXhC0L6TRgkXv/AdMHkJ/O9Ub+rx1nd/aozFyFICDIV1KsaZhbHyY/duVWSGUtUHZK9A1a00wFlBqB3cqvacVhWu6wuwiT1ReTV+eVMOS1vyxt+aOE4nRS8pK0l1KnzT9xLve6bAj7Q6ZqLHCI9VwbcvxuGcHnfZbDbFzb8Kpx9v8YQkzC36Nx45vwhw17bOaIIXOp/C27DRWOCToAK9iGGoROBaXwhS4eUL10jx/D4iXLL4l8q+rbfhHXQAc9dE9gLAy1qB8m2OPd8Kd9/ea3Z4oHk2ul18sE0Dymu7It+CVj7ePsdo6FNI6xGrgQjaOTljo+jwVN7Tu/ojYqTbfXZFz1XmjyuJwwD+3dVVJ7705gjIiaWhLOxH7hnwMu2eHAl591b6SVst3fTSkha/Xre5DF6zBOeDCFy3TgoUPqI7UhN2zYJuPQ7uMs16lFO1nHJLSkRrFaaPA/VnuA/mTP+VgHb/AsidGvNqffWh3XU9bYnqDZaOw5s8IQq7vKH89wagP7tYWNnUEt6/4L4g/UMeLvzLvZaJwwihdjNJ+0eCa4qcIC8cL3BhdABsuJIZm5rMjUoSdyXU7sz0/q+4nZxj4lUib3RVu6bdtbpXNcoN5J4EZcGL2LTFwh3pmFk9qfSNllB05w35AKTyHJzqCATosUtA/hLhUuAUPHCDMlZs7eoAJen0ChcUwN8hcH1Z8oa9tdN6RH+h0G2GwVwbl1vqad+FPfwNQErSDtfLdasIAHZXpnlVULko9UipzpQMaxV2fmJhQeIsYHngNLNHlzgGxVvXsTCzqolGagAXiEZJ8E/GYb49i9IS80De6mUuO/DqMB0V5q6C3RcLvPJopk/qi2RnaIc6OR0+wGMcbllJuwa0ZsV4BbswY/K7tLztRVqpO/i/Q/06cXRIDucwDBmSpZ8I6vIDG9GLQwdHZ09V2dUnfQQyPk+r/fpOnm+8B+JIgQF1O4vgqgXtZrhmmTQM6NMjPHU95flyac0Y6OSghF7sU79AX9Qo6qHuB4D3AyfWPO5UfhjfgSXvnNdkl/ttnE6vJwuIozfcSXG+gIspJlk4oIfIqnhUYGa4CVB7GmZyo8IvztPVTlqbCujki9ysypWmix0kdT+ULry88OJFvQ6h0yh+Ir0oOlMyVaZGJm/YLaOiUMOmWHjLdAh0X0H+Bulz67naQCgR353anRqDeXPSusEuHF5T6MBJHFtR/taGYRkcPGookb4XBLoIWwkh78Mv2I38XSNBZyxmFPgk7MX+7WrW2B0/LshECaGBdBF37HVOjM/sxS+7FVhK/nAa0Rrk+ffrCZbUxV5W0fDQhfEqkR6cZYji6bl4BcV/Hr7OkJHaU6XDhfIDWWTaBxXUH4ed4YgQHZxO3TfjoCkuSxi8XUhlNkq8L/Y/4m5UfvjxIA5eKJrtGvi0Zudz9gY6jplmf98oc7+W9MvPaOz7GXlHSBjN+xFjOOTGwbqwpaD26pJlBW/CqzbTS4SqSab7hT+6BJ48hxaL9PmyfxIbSY/jSHT+QD2hysYEPAaNI6HReCoKTSTZaq/ghVXyUAu7FuRWX/L2NKCthZP62gDdlMCZ9P2pZfdmB9YKkIY6ArpFOJfb2v9NKB1z0rQl57KXeiegq0lLv0hKDG7a2j5Rug94WmA0cK8VF5/2sbWLYTSpapq80xizVKTeSfXIBHTSsKGMgFIhB8eYBTWz/fVVWR8XbeFlcZBmJFRLBeQmNmgXC1knavs0DKMPKg/KsNVnW1MaxbUn3B5WLSpN2kUiliht37rhnIOq/TfYmpMvU5qd9QQGDK9bJ35key61B3lEB8HEp4KDIpOQ0FAChhRNPhBCuRzvn5cRCyfJ8JzKKPl7FPJ09YOYJEQ7ov1zc1frVH12aOnbYucIAjkOfOVSj72jTdwMnvPKi/IUUX1AtmpjrP/bn9HK5UDhbHbTbFov5sPVFWYqpXsGXVcwzq0gRVE4nl0zk9qDnri6xiyk9c2icQVz3KLkjMKxBQEGf/mAthXe+Q9ZNVtd9n+q4AUy+xwRb5Nr8PJZbVsmtgOb1ZaV1yHe9RH+FmkxpatkenjIZbA2STwJTYzB4ggYLI6MQuOpGAyOouuyj+fbh9/ig+I54I3rsR9Cbq/+xoYUXT3+e/0XeRkilvW7vj5mj7VgzP6y5KhdNtSEljoKdx+Yz6nCJ81NVmd5lb+0Pcsarn9UK52L4coksSHd6gJyXmek4Imt/P31cocHag7dV1/67xqEl4ZYCKrKutHcwGboDC57SWQP8qPa/Lqz41Vpt/Ga2OInRwM3kKvxru9cI/nptA5JEVw6MIkBbf7q10Fd1xjX2Nco6hQ5826/e7w+6CxlDNBAy48Rp4KBDWRvEh1Pf4OR016nm9+2dLwuff9wVUYquTm8gsHPN8Br6mZRhMfPkqfi65IUefwxTvWsiRZvm/CXEkotaTnmkLKx+WPxALDh78WHeTEmP68jE15nP8+qi8bnQ7DJfjXYIV0ADLZ/M/+jkv8jWAhLmlr4PlC6Q5PYYFvf/+QI5eruGdlMb1T5yGuTEgvJXNDh332knuaihtDcwsynAkpRUpLSZZRySiX4poZnJofuYW9Fg3Gd0j04qUR6FscLnoKadRpzLXkz7qAb+er4P6OnVnEctkg+vfl9aR+w6e9Fh/mxJj+vo+JLXsVm1Ean92U8iEB0RkcgbLrxofwcEywJPbrOpvr0wA9OzrdHcu64wVX/UafHRQaoHY1u2P8tKUjuobEw2q7mmtU22ibB7NuQ3LA/Q/LgZHCC+r2aSaQGD4KMgRBiQsQRsXhMksdb0mamg5+P7Q/WmdinhscmhERjApkUx517+RhDHBGDxlPRaBwZGv9wN8txpxwVQEqhaaAVXczqzCIHehbb534BBkxX2NA6Wgsspb6k6EslDenEROk1KyrNVfp/8ckr8m2eOw4u2n4OLc702vdf3stPf1cRCz2mEGjEi65hehjV2bZhQWadKb4hF16be8sX20cq/34451GecSjXkM+W5d6AivFShOLbJBWbB+JQddFaCgUc9fXocYatazD3x/2DvFRXqbDZqX/e7updHjY0R9oVeNjI7cPdHIGfiOYr5JPLFIwB2mrQvKsVVuz/uNrW78jKdr8L/byR2aCclR3nhX/D86wOAMMx5lIU8d2ZZnteoB5sc6sKDIfqRdNaoU2hGdOA6VNAOpQvml4QmhFSkg7T099Cib7jbzQVlnuzWzI9n7y3p51vtZr/RifwP7hiuh9exJHp7GtjAhjbVY45B6Tj3K7f7o1si3lFs7Jzs0qFeQVOxRmn7EWR7w7VvWCtGTh2A2A0XAAYG7aXT7itrgG2mc59GWouoEzPw3RWUuUH8PP1qgH59Zk9HAdscSuzJY4DwXRnE6thsJUer4qcDZaOsCo/WApUYMgB2cPP3HNwAQjFrzKApJo0RwtvKI4en8NyMjkTFY/Vr3UZF7d/vHhVBjhOuX8cr8gExa3QW/dWvsP0ceUzhJ7mI3Tl0xpU2LDpdl/sB7RFprJVDKpfPh8jVxqQ5c87ogeqeb26g6YD1o0YGTANtLXAsqrsJLTVNbnRWTl9AQMllYZi/x5YzK6y9JGePaz7BZiBRkDWM0ZZN29uik0fejjdl39Y+yIgipotWTfbsByYR3eRLK5/mHfCnR6x6ghP59F8nC0T0bUqvdotYcgGuWPnx7hZky2cAO0Ivq087ZI8oQvsyH2LuyjurGnAIbhdAhDLpRseBv6WexT/E+KVwQwBXw5RxMlv0Im6sQCk76B8v8BvGR0Wv7RDx++598T64OoVDcTG5TJjEchG7Dq9pvIju5d0OvfNZFY7tJlKf9OQIC41f0KW0pPpgL3r8UGQlTDFZvfkqLzALrtjJylXWL7XG7ifdRmpuIP2sKSmztbsWa0kAvpFaQX8T0BNfGoBgOwF+NPmbctmqxt6qtl+c+z/NFvh5mBi1xmJNKKNjDgfkTki5CWtEVEWoWYPW9V1vzH2GzpDQE/e2caq4ezUAbTw7DPMH8A3lzX8ayKhGCBT9eeIRPQuabQpbsTR6bbUg5sfu8aPyd7EFWbGu9WQVZHluQuCw8hYx1veVw/E6MDHkgsfwlrBdgktACZJCLX9owyqEFRZNJgZM0w0Cp5GLmbHFoz3RkL4Gt9JYQzMYDHi5nRN1IkcZbZx7rHMnrTidLOtvUxuKw7I/KEYHfib5MJaSC81+Cmy6QRQZLdwPVVwZWF/NqqcCM97Pbk5O6Zksqc7fkizErKbTxxIRyN/sv6P8hj5gLS0ojHXfRTGslu1tZnhPTA6GVyaQZ38kygFWW3g6F5KW3pSin98xABztquvPybdJqDVzoBExnC4GGU/3ceIwj6+Rl6+zwRhdF6+xsQpSFDfkrne1f8a0yd/SeDr6Zsc74K0MP1Hag6ugXp0hC3dIm44ePHr+Ae4t2IrF++XaYpVzlpvYBRG4F/d5iWL2U8zEMWJeZfXHvFShQJRijRtpzbOOze5Oa1lQYAAKJKQ/uBgPJ2zxbi9tDFXtomA2L6BpevCIYEIeJC/LiIQgkB4ehL8kbrHdNTQrfVLhN2GtmZSHw/Sg4JXGhRXmXFVTqx9fqrJeRznl/0CUOTxL6plFcx6hZlMd+qRzBxB+fPZOSGc9ApPPbWE+bRt7G+6CexiNeeUcr5jYnaREBHrwRXPx1v1JV7bkto8z3akpc2XbZNrc6XRN8TooPCb16fpyH1TNBCJvxfMMTJW+/PZdZHZ+s2Jo8KfIR/CWmlp0rnOEQCVNvBcN1UxsWYDLcXovsHBqJ6XcRUd/Mi4o44qmnjbkzCgwRjJiatvEthKbM95XjTRG326d/ZQnJaWIDXvO2gKCQPqvRoFVNrJijjFQxEln0pNx2Zv9B2mNXaFDFwXRnsbscJ1mlrBfTbM3Pu76kFC48ZmkvalEcfRVZTo50BVtuUpo1LM09q9ovHRJnPcbJtR1jF/Dxa6/165XHaYn9QDPmZH159zy9KGEVkhbb59tqQX2T9Vu1TJ9BBywCJPPbWU6aJ96oXxiZml03qkME9sxX8bFTpBuAyyIahfthOU+6g8gEADtZPbCX/YdFQb90wSViu43QFlGt7gRiJSiCf1zUse5ylIFjmlofCJsxq93f1698WnFIG0UQp/Z/LsQBIRgT1yUpDi34R/CaAwjlI5BXAxXTFIFgHYDnUrAacBS+Hd+4V3nLv34xwciVjVYyaIcd2zwj7uVQYNfO9paDqgg3xfZRMUuHpAg8kJ9xle3Z/Rq/iQvQIE1XZjT5B6j39KDMGnSXctHxBNYxv0DFvBiwDW8w7GK5Cid9lrRF2uAD959P5Mv6IoTcU9wQkRRCQ1ce/SlxEsjpuXR8tdjS6w4SOxCzJZfpcH3ePbtNP0wizkChEeOQEdA75JDVo5RjSzPE/IWiKORPYG6glVMg4mBGNwRCwSR8Ng8GSbgJazp76VpCNFk3NcE8x/7iY5Z7nrS8rzSRPUkMezVUSN6f3DI1mtaSalnKEWwfaWUyMdVrgjZfpZW+tXGY0ZeCdoPsnhwzzt6ENDRlHwSl9jH+DUn0u2Rz8EBgmLE5/J5HEegSkpbEhxwrNUeeI9bkp6ILsg7qmsOM7dX5oX7i9/LpPJ4zQ4I2GcskRXdlmiO7ss+SGjPFnFAsUJab/K/LWbz9rJ2sH6YeeKfS97J3vbduqvn06AvYiyLfZ2cCzCgBAhS7zc0K4B0R6/lv3WaYiXYwvvC3NN1wsYCfRMJJbJTOu0FAXOpTlUWtRlEioXlpP0F0ytV2Uo2yixFg8wy7JaodDZP3XZzdFZLwFepZgAEeKyBYfkmIhIgjo9PRDm6SJ/qij/f2+Etk+5yve9/inGaQW60zHNSHEZFBTRm4kJ6In2yjW8VRLqlnHu88XWx/WfY2nJepBaP0+vMvjmhAvjwvSky8aUy8XxYUfG1YV5lysjjlnn6mv5zGtq6/nHq3nGamthFjU1tTxDDfwoM3daDrf/PQGjJcmiONHI4xEyfxKMLhoZme4FDq3Tq0lLjcldJVLV35Wg4erAioqiUO19rFy4MzUuegy9qBE37vQwqyc79Bn6N7PypkXgaoAus/H8Ir/kKLGeMQ4JxWC8SfD2mAms+s7LpUHHyMiTyeS4smRtNT+pjxIDItBUrKSmJ1+OT+4fSU/rH0xLH+xLcWi3C2vDOqD4wuBgvgCNF/IxGKHQ+GV+Zltmfkc+oe/zophB1LbYpjhklFK2vx0uhsT6eVzLFseHMTIqn46n5KFCaVGtKc8r4zKEbGwemZBjiFYMzZhEQv7R1KacyICeV+a5C8mxG2Elfivxcggvb2U362JryVa2Cqe0KMpHu3KVVUkvY0JcDao2N6TvoYGuul1Dp9qJCpZ5G2ngiFprUbV5xF578lYYxCyOQVA1kOytADBrB+UbLVX2us1f07//kq7+O9J1LP4A4p8+dMZotqS1kypckJ73JWznWWhDWOEwkmZEjKOG0TEAqieNJNp+Eh4m1r1Ww+dw5VmJ6y/Oax6oqGt5W4Bt7juvCiIkhodDp1hCSNBTSrCEqet4T9e46UfpM0ZcBDMjrF6mQy9K73aJPyNwgIIyLVEjjtLiRcpmB7BxxHhGfOSIAsWSMr8eeHn+cKDOyFZCF0oiGLgAFsnxlcZib8YAqwMEUQZKAcR5N725P0U/WYJfVM1k3GScUTVtKCiJj+bnhJ8Hb/v12LchLqohqHESjTzlVPTsuxPpF+DVeJfspmx1KQMaqHLg5Ac9ZE4eGolRiVkYLAKdlWN44ak9B+R6Fr2NsWSUv3Rh1/WORjqOs7dRaBVRkOHEqRp59y9ox6IMNoBg+VWtfIbI79AfmslhC4go36pPa1Dz+qQaQYC7/D+gNmmQ/Kz+Y5ya7sv2t6TehthqZFfUZKU++ta+Mb5Yyy0CEQEyGklyDYoKCI2xF6OHVhreDzyCbOSUScHX8tURYRlYGUaYHRIEF6E8gj2DbNwxJZbi/JKA2BpC9jDg6+c7JDVa7XquBTmqTV423lD0kpmOTGVUWWGH7J2uSXm8dS+M6Pw694N6D7lJacG/0mCxamszzptU/fkRLJGRs+bSUNXT/qPwdXVM3Sskq5SskCzLzRemlixPA6atJoQ3hfXus4PBB0VmBtm/BE66/UMy6o2PdkkpAScqX//OtS+eeUr3JdvRGtLvpZGfptoX9Aa3pZdEv2ZCtuai8pMqSgowZak5SZ2WN+Cd7cGz+cU2nz2QeyhIQJBBUJAO1sdfG/UjO+DhEBR95eeNSyh1pKTWFFK6BbPxKiQQwS1zIsSX5stQAMkhtFLJJfvmxFEZfKQJRS5MDtUlaV47VtlhNdt+87grhxI04CPJ2fXHzbQUBmRRUwTAAr/hyFNFddky4yraBFyGX+cufiDqmJYC8NvtIwtkbk+QFLrBvrYV0kctQpMqzsgfQE6f4IoqikaHRV+BAiqz+jMTSpp4L8dVYGOzZkf8k4F/+trA7gzVD8GRVpXw4frhzfPN8s2Lc9ur5fMOaTsR+YI8p+1wrgijRRVFOAIudiA23nCPJUU0Hdhu2jKuPtdPIUC4Zw4mIDBT/AaMquH7+AN10rU077h3iEve9YpAIMXwlYNMRGeb/+tzt7sJTj0Ky/iALR39PfFecEbH6PPJE1Ynn4iOznCrHXWle63+HeuL1L1kpBkaJ47dy5LRTAea0axVHaOwS4mJnCYKd7oOSPvU6rKaLP2JO1T3WLZGUb18lig9CbqdFq2U+byt9NLY1Iz7WFWr2mT8UzykBRDjpZEIiSz3F4WVaKQwtH2nNWvZN9lnNCEW4IUVKA3NEvNCvLUZIDckNOI+I2vaMGqY+oRZnhJML3odOfMQypQP32z+Z0fIh6CKnLpC7zEY027V2nqaD9eocTJhGJ2RMNA3hBrIzorr16p//7g0DZT2/UVsXVD39+05j9Y7y1rvdb3d65nPMmvojZlF689Z5mhDJ8pbO6aSK5K/QrL+D3kreM/g7MvwgSolidPvKPiu3YqGSgnVAx09Iyg/O+9WZ0PTh9v2aM1Ti/cskRHCntGQ07ri1ar2AXOJ4SHlGTtDGBESyk782fG3LRDhA672Dw4w0f11+/JRYPmjHzyyHybKSYKCqHhh2TPA6GK4O/kcm/8RNtLyGQUpEvJ3UOUVPfdg4JW2rTdUFi/pjJd1E5YBSaSEoylXbbtlO1nv23vXAX6AJf34sXx0lwjddukHzufhvreXBwbmI7tmUkJe7MMihuH3aCuDH0bi+I6Kzf8SubR85RHxstQzEa/qqSixPEKAByPAnmgH23iqjS3//Zic550ojChOIMjEH2I9NX7Pd29g4NoQq/A9O1ODWLl39hSppu+JUfaSVMfQaBZXjrBRl09GTiPVLPdWiztKKLJSLVYsdWixPGhSNdXLwTLYgaoIv+IZTcO9s89b/jwhIT9HwM/LSRSVRhd7ua1IOnfLxMU7LYmeP3IMt197pauBkqQks6C4bAaqRReKTTBzSVwVtTQj2GHNzKwMpFkHKxOyve0pDYQ5ZAt9ae7Bkvg8GUXGVVafOqtDV9Bzw+Nmfp9ZbcGLXJD3zxeZAVfOT7Z811tA428szPr82/KO1SzGeiVMGKfF4AeMfb5D6qQEhQP3PkrL9ir7/YZHrhJUnoidPqtzecmoKUWKxAWTYAIWiyNhMQSSq4Og88c3I7W27dLskxdG/5XEjuDiL2heUFsIIjAOTn+XgOYe8+dPawwMdGuQldUNJhWhq6V03lKuWI2b/n8EECCgD5ZhMFlzXZg6zPX15DkZPw9mGqN6lndmf0YFQQZcPEq61jOMpyV+fU1l7u/Ap9mbj+ST37eUlMgOZ3T81dIZF6eHGkv7equklWG+D3jbaRMKyEpfp9+QvWxRXfzaoT5Hmp7ys6SigIQ6vpPnweyzt+twb9+b+qmRLgY2D36bQhzKLd293S1tIAEG7R5+acHXDHEobity4Qfq63a/abqBATfWz74uogX7/LY8tx63+fdabMICwgMDA+jWlyrM2vwkW95bxR7twrd3N041FtT/SUDtUod+Pko0QT2X1JJFiuqPPW5+8sOJGA30SuzXZ902HlRFfTf5ABvFFPBJlc9xYePVtt/mdEYPhAS9cFXpsLEdyvgh6fxbASdZ8qdi/FsU+0fvUZp624CK2QFdn/TRSKinmnWJKSeWZmKdTxkWJMdFJJaGEUjbt3aKhhIodgTqwzQbuxH8Ppbciq9CuHjB7ANru6rtIy8LBR7+kuussdTV4j6/dfGXWswpG7sxFTYpFObtGxZ/GHE+YOKi7BcD5+8J28+lttkbm2ipeOhpQL/I4ERWZGNOXCq6VNtFjm0tKXqFoHazrvfanss3/nj537P6ZckTuQ8uyE+mXBYsbLSZE+YfO5ezo3eSTOv1283869UbEvEnKqa4DmnTcKYJWemWwPSX4YIwjb9p77Z6t0B4/q6lVnrPRNau+54JqZAGjh7uxjAImrJzkpMYkClpSuqY9p7/fYcM6j117n+sW7LctDzAVuS/Npcn5WNmAhUZnQgJUyIpsONT2vPdwDsB4i6OWIPlCkE8jHaM1J/TzNSGTZU3t5Fyk3LmiDk8t+BEEyneuDUdVaqwWpNXId/IaB4LIvhh7dSP215bKZnfTwy1ENVmaG2kkfO9UKs9YLoHCEF8+OxkTIXeBuZUI/vUth9f+rN/dCjsNZGUO/ECrrCmuhBck1UoukqlLbF03qhx7l9xnG+La29tfWNDLzrFHBwT59PL08tX9SSyLq77SNksuEPWwcdNqj5gwMHX1yr4tmY6a3uT86VhsQTsrvch68ae7dgUL/S8iNpvsbs10XTFgxH53K84aYGCP/ao5K7DX8S390oIGYfSo46OjkWuqIf91smn5qLqOPpglU9jGuIGju45Ijvgjg/csnRui8xeTskxKFK3orXRx7KVpV2py/KGrjtY5IvT2P6fTEFk97x0lxjm8DL1izj027RkdGPVj7x65dOVbxXN2gt1p2sdo/XnPG3yjuFaW81NeL3WB1fECyDvf/yjdiY4D8SOpuWkLO8GGtwVqjkTzGd7GumzX04skbBBzUgPI5JYp2wOi8rE/RlB8bVX7hmarJ444/uLe0lCkt9ItQH1dBl/tP6gcla1mLZrTV9J0xkd44hk2WclWdkIXnX/G9ris8cjIQ56eE3tyKzmWM9Dz3mUwluuDEbHSw4SGufuiOs10cL4ojQBDGM7bdPYcIjhGxH7V10VAMknw0m39mWNAcjMBRHZhfcUddaDAOolOioaYxsiJMWKCuqvjrTqVQ4Utgae8Vokhm/Cidu8E1bbi9SUNdK/3cuWV8kn3hAdPzA8Q2U4ajLb/1ICaS0w+mAML1kb4cKIbHbhI2F0uuDMxbHbFnC2+7707tFEZ+q7iY+6QA/PX5MXm5CZ6playq3D75tlu1pb7ZpPLYX54seNNqilncP3LhGbMZ4tfL6gp7wrqxxbDI9fGIL+lY5AyB3PZ7omYqG6GykKGOq8l8zvHuDKKk2ztabBkIHK4LyMvoB1O3z69e5Vti2GkCY4t13YOfQd4om2yUZDf0hf1bRd1huYQpy/9XWNSZZpWp3I7Or9svmtd3gGPyAQYQkY3HWK6aayx0g6vpDKetDdLTeW7zRjtjKScJovCxsb3wTnZfb6b2apH3wfUg8cxbDj3h/3uz3FvMMciFZHaT1st5P+F6mPdHoPdQLGhbHdMYpRwDbD4j+ATHv7u/tMeyBT/b2srL7Oapb9g0ybHej39/ZZYTjz626Ob6R1hbfhB5GPWoaqOo9dmgNK/VcVBbCEvu3X0s9pxnUUtfDrNxFU70Q9JDsymAEMx8ZlE8MnoOReHosbECEF4Ds+3m/9JMYszpCbDStY9gKeHZea58dsNfgCxF341CNPupFgwFA4pQXPcQtscyqjvseiJJxj+OdDq/iorHDXFNNF+G7PDbhPP8jxmWYT1BVB3hi5/wyj0TfngszYheEL+A2RgKvbI+2IN2yrksWFDxb48u2mL5SyAbO0x5dnx+M3gAfZ7JaWF8wC19VzZW0BvacReYeqin3LTq312G3LkrrEaL52OthWVnmrulexypi5qTjLFris2NQQ4wxG62tDlaUVoXnp3f4nsozkhRdxnAv17PXuTzzbDJPSBa4yCW5IDQ9MlTXuT1HZUOAZnIzx3l31oC397KTLZ32fcqfkhEr7x+2aWx6gozDu07MTiv3KmXKaicMvKnHEm97USgVbc44qPHACTQpm4GASZChvXaU156lyAfpuaoKZRlcGGZ2cgRrUGsVi1brimFleF6BLtF06/SulceVAfql/pqwLVYnXFbaFfsug954ToRHimTNwbWPv5qicAE3SKSGW78de3iU6pmLkv/4BWaw9Qu5g+lIr00sQNXuSe6meWaR4dk8YiKQtQ/n1nNXugRHK87P/LKNhOSo+0EuOcpjAV2Co8OdppH+olwdiZbuQgDDGX09eT/6ZvKp+P200bYsaUlpUnnp0xjD7rM6uQm9TiXWdtY7lSxvTHRWScSnpdekxKeLPKq1MX0xf55fl6weXXZRWG+Cmh8xfzO3mZfQsKwMT+aUlHu2gjnOyVN1LeNuzGVhzCq3DrC+51Uy3GeHFVVnlW7hvTH0oIQmavceHcTCmugHlPam7NxnP1Wg3paQJiG1WBfnTQmkDj5g6bFcUAbxiZilIvcjz+RAuI7UzL5zDSfrspEy9E2vgUMqFe2vd9t1eulCkP/ZPhNdrI2Oyr54c4gRlHwGxvUm5SUC4oz4gEDvYCywBYRkYTl3x7Twp9F0RiOLYfhUXUUK2v2yTQ2TEr/6JhNAz4DfxlMziInprPyorJirA3yoZ+scVXlWWl4+WMnwqZ+h9Z4JRXSpV/SepCLGNJcESZJjDqc31LbZ9ktHu9wiI7RU3v0Wl+KnhtrISpYRkwMMxwDxq7sbisCfSjealN0+c1FX15DOCqiApogf4/ehNaR0Bd3xT+HBF1xxQsBqavdsHeKaOzt8+2nxT2nDQ+GUGsd33f1HQlKvKrZmxJPm/E8SOIjofelXzCO8CptAvFPvXyh8+VOHPaG5ZGkeRgesleq1c6kqHjYdUOanpKPfDSpApbaNpAfq+PdzMzExiuoIbYmCg5OkagOX8apOA2O77yfIL8Y+PB1Ry12T9z9ZTUyLX+3sjV1NSn61a6f0hOxZknD8Y1fOlZeQGcVL/5dieXmCTeM8Q4GagIBTcrXacoLonslVyxwGvbuektc/i08/FZ8DnqQcfreyIAMohQEZeKCetALjrlSZyrkApqTQjA9x41HgEKk3PT8GW662iNBEKyoW/2A2MSmxnZMijETGgu2f4YP1NaYNnKl+/WNEyoGmLyithMhoe9g47cTRQvn6vabd9s27zDPGqr7HvtOy/7M/IkvKxb+b42aUWsY0lwxpyS9aTpGZndmKd9F93aHhTq89en03CTyG0h0C9rN4NOJ+iV4/wZA3AKevtsTOPqEJUy8vaZbf1cCeEytcDh4xr/F77inmW3tK+3EKU0riuidESM/Xh0gbv43mf6CpPyol56lpOt5nZUZ/kpmM0xnWtjd4fN0G5ffgxH7N8aeywGZoXmdRVfqbsId+Ljworz4CTWnvMvx81M5WDtyVFlFGjtoZ7ZHfOSKx3NA2v1N0epWcypa1CgdYH6FxbtiC3Zy+hIAW0ZWXkQCH+y4rzcrC7Rb600w0vu493Zr8EQhoqKyqz+FVqchLmWUbJK4hvf5cc0KyUsxoMsCe9wRANr88TqjI0praMPqg7qChqONmeMuxtPEn/JNOJH5YR6ZRf81KTwZIN+QJVBkF1yzlz9yvRl20O4wimyf/kqn/tcwmo+5An0Cr8SCwMbbfiMyGLzTVevgQ/JF+FZ7NA0RZaImBIAYWfEnKoPp6RrojxrCf+Myh6rUyxUxF4AqworGCEXLQ5InFRwtS+ZGq8yQK3UKItn1zPTcImZSQVJuOzrIGAY4abAT1fIXOgcCBjADuAvLP+OSp6ttQCqjdsaC1ncE/CuvbZ4m7F/ndTf/NELwCrx41+yn0JSeHfBaRDXevxBbXqyshaZFPUYRuu64e7jLYazrHJwk8cikzYgmQNL/GsXPVLCWrT38VZEr+xBSmMlkSaKYV5At+kBZeTxfa0YwUmEspHvMwR/Kg8RrHzeANNfQXopoGyqoaeQjRucOvNelHB+mqBLUoSHzza3VnZ1NXZ9DjGzjHe3gJ3dHWlMzDUosjEBp/XYhwq3M/PBQ7V48trOkY7enW004w6/UAkg43CiobG9LKKnJDOt8RzNO3XtYG+7saM3CRw/FmjS8QCiSFKmncFq4uAdJALwB4pqv3K3l2UGtUare8pyG7qranRBdCNwxtvAtDxIRQ4ZscnoEUUKlZUvF2u0e8oe4y2vBgvUjhrQlrh2k/ytDZjcbUVegx6YxFTQhJHPsRlmmHWc4FOJC1uSL37kZ6Lvcx4QVylyts7pEctwvuSCwxs2J2foxvToJrlWuFTkak6YCoqKip5VCP78LOhyMJXLn++Munf2WFijKZ7Wg4PTs3csG4BbMskmHYUpddxjT5CJQRnrjIhnKo56Pa7OfQcq9JhvDuijTwxv6dzJ/8GSYwowt9uAupibjjuCsDaFVslzHsjXeBmkMUZcKr3RV6WaX6IbOQlXVflP4hY5TRFdD/bmmXvhhrzW9okaepbKU39qK7I83EjlekNnejMls4XrRFno1db06o7FN9KJrgSnUMcyAxyIJLEQGEoEcVanjFEV6oDhUXxg9OiMBh6BMTGk9Ht3ri2EQwPF4UCyDj49j6cOxR0xtzIN2cYkJzO1j4u9HN5JERw6lFSk2EBH9oozzManBuYueoV36kj1QuzQIE4em4Yubyg8kG/+Fb9DCOKKcaIresiHx3YMeCZ0KWXBqKahZjFaElMZuKgfbrMa3dtCMHfb9tBSaz9+twbxO02wr/72mzhqj/QOfMOR5LVpYfbFtsEmGukHHTacui7bSUIsf8d2XGtjSNbruh/WT7uLtfyMM87y2NYUNsKmYEoiWxG4/BDFbirtA1Lb3g8yxc3t47cvmQxff1XxsCIeVFoGSt/IshukkJrh5HDImoiP4XFlokcJt4C1P8KYTeNnqxPZlHOAexJrzPEwGrzcrW12/rP0JbRM2YD1WcbE8aDtSc8y79jW4ZaUpBV2idkcwPmH+7jygrBTZ/vMVWGNTZhouvai3EmlZxtZXQvhP368w0E+PAAkjbNzqzhNjvESjmLzZG4fQLwc6I9k5g2flRVVjIlBkQXIAspzEQnpOGqM0s6F8wCoRQSAYkiY+AxWDCFxvHsMQq71Z8fmU16w+NtewH15pmwKNs42oGaiE5ZyMwoaHzxBIVNoNmjXHxcEMKhGNUWORQMG4yCefg8CEZrTKijGtaVxsRFYiGG+wky4pUa9omqv6vonrlTGz+yMisRlFeXi8F7n+6AlHPQ2rDz/eEgF5fA9eD9v+DLTw8Fku8DHrkwEui8HKiWaJyonAh+ehdEKzZJC4dE4kS6RJ0n473OxIBd1Wls8b3GQaridLGamF60aPTOFKuIgx5i5wagVLENL14j82WpbPSLQmReWcFL9Hhy8vhYKLztNhkohtFcHXWWyWfpH9dgSkJ4zNUoNszJlYevCO63W2jsGmwZHMnY5/HWe4Q1NLQxtvaBiPOvxgGjymi9ypk6lYG6e7N/4VFimhAXAQWTG17WU1BlcVQRZUuZe2MRGXQHLi9ljAbT4L7iYD99Bg19NAqGwQRC0Bg4BoH2Bpqg+MFqrs4yvV4rB/UKQcd/nJF1Cq0hAbnMKD7NWcGDiqcRkRApIFrbsX4hUnzc++5F0UxT54gDpa4jcoHlRPlWEJ6Gg+W9z/SzHAC3Wif/ZxQabR2kkYMXMhTB2Lc927FdE3A3fwP3gySTKoRqXFm6vfzwcAfs2WMtAAD+mHI8Xrla+jO3Z3oGaDrKaD3t8na0zL3r8SJx5WZlTESJU7ywrWLV/h8HIFDLRVQaHR+XnykS5WfFJZQ8L/Nw5z41HMAuWBkQY6r2BSb3B4xqsQ0dj3xyKFVBuToYqBbEFgShz2IFCaQo+BsirRnq/3hxq/StiJd70vxCtWJJ9Nt97uqUnhA7wpRe7wH9GmQFJ2De+GmNQY06ceQD+/URcJQmSp78/QDW9qot1iLghQx5uD9pOBeTONzfmzSYk5M4qEs7gh8xU8NWoi5W2DLceso9ZGrh3+G+EEY4OSmp3iaSGDqquWjx/wWZztqnXnxHVah5BFENW51w8ZH91cPecvc0JZiZTtpNTIXgAed0hj5jRQzcwSjRP7dMRxVblOKh8JHMGbwUBIYI9NNBBjXvB1aJLlCA2N4QLv9xsvC2UI78BVpBT3XtgaZOqeD9Q6Hj8nHarq+f0jXTPlu9ljvquKDrEAKyT8WCfkMviraHRmLHL+odsdlHRkWhPwtozFNZUqmfNl7DEnQaKXO56cPIljfkQ06Yh2A9YFVdxGHVV0HnqZY/7laUSSbVySBNFz0BZb7Wa4trHJsspZ6mJ3nfX/zI6Ge5WfymrjY0L3PU9xzKyehRITHok+bYN9zRn8Kb7puVkxXXFawBLQ+a9UsZvTZ3WLwbO1xmncyexVBuE34vPDwCY4O2mjX/U3OLUUYzm5NVG1rCQuCOu7Ym3Onn3jmRsfcZT2lvwS/vFPdnuDuWERLCUW2hNmwmTUlckpxKlf7l7Q6wHIN58apEbz06kDz7KzO2biUL+SnzAvZVNzVsvFvRHQGj3NIaa7lvlYh71P7OdWNxwm3u3TdOG6ph3OsX4SpiSh0DEBke3YiJblrBxH5EXwHRAfWKnTyzL2zPP4UO2fnx/7CPaX1sJ4slaFJf+Mvo+du1+/fm1x2Orx1NbohsfkL82Rdxshe8eWvUws/atn/gaGzkK45yanjYlI7gKpVvpy6mYrYLoDP1aueyxq7iKoSL/ZKCzdvPsbwEfrxtWVwFN03kl5fOUM2igduS4h9renrFasb6CoOVhBq4BFtJDu3PUF/TBwSsJ2h/cZ9X1QhlxpH69uWe0q16BdQNSb+WL6r9UaqJuJw6l/rqq49irQ2nWbwma+wioUK8zpfNUmy9yKN282E51sdVcA94+xY8laJ2t5/SrL6bhB/JLw+xMCJWK9avdO/t9gf+NnFSszx3qgOBmbg3kTQArb+B4IGIqNi9cWSyzsH8VMxO1hXlO7LmJ3lpL54+aBmq7jh2a/YtWRiMSuxrDl9nLdXBFyazDxt71GQYR9MwUQ6e2ltJr+XsPXFuhFG21d7kNHx3NRuwB7rRkTUjs81H5kaUAL2TINviANlKmoFLOCPDsw3LMjyPLygBE2DJhZ69NA3XgAJwJ88Lww0coun8va2kiTc9fDQdL72zlBFlNamJ3P0kokSl1l0mfUmtT/T6d40k+TRlpE1qtkGvmWdxqkF4KD7GLp5UeUUUPZM+unoA3ndVfrhxTO1peHL9E9MnB81bK2sahKwPmCgTUYl5VPkSB/OT8xJ+xydl0qSLKb98kaFB2ftDYT7DsQ5aTEvNQ4b/Cdn1Wvkoexlzqfr5KjLVfvvmUBgdSwat63tQP330Jz4FGpGnSi8zY+JR9kVGEp4bDfqok1pMUsZAE6JG01GVAYHsEf8EYEtkvfULQ5LRuT4e+sWapvHap2lHxvtpmCG9dOPjw3R6Q+6Ar+Eueeo5QCWE8vhy6A/OzfvIcCcCnmlUVGRZRbL0wYDtUHAnjRu5mjO493PwD85yTJSEI9oDEBMzFvQJ4VD/UZR6AbbhCJZl6CVrW0okqftLPte1mjVy9laQL/AvGQWlEk1MvVdrGEeE/PXM3H3MSaNCw4x3PlZDhoVNreJjLUkjwkP0JNJue8IRzycYva8kVTXuBv8p7OD0lPsjb4KWlaeMltXgMv+5gHLcrtoHlcNcJXAN2YKqquyc+sa0kmrPxpy6ZXQLIMXdOZuwEO/WdQOpoEtdD7NIJlSD2a10ia5rUWs8zbSvBSg30oI3Lma83PNZ8UnneUcYCUGac4yaGpaE0B1A1GkJmNPAm2IbZWonX+vQKfT2VmWFhcy+CEZU0HRsjs1SI/V2sWmA41gNnDNhwYTkCI23xIIsLJt8q2n+3qgpe6fgq/H9qPHEjHC+XW4gpShpYjB+VtbcUNVgKsi7/PM6HwvLneCLsoCw+DAT1GYxmNvIJ7WNNLOTrY7uFJJlZBaVa3FYUs2pNSZDjdifN4goi5JDQtPJO90vIbpldughLCS6th9xYppbN3PK1L3dNQw6oxyr47YZTT39W36yK2knpRSWZbgk0RXIxo1eVDqTMpbHxQ+54Cs+f4sxCVfvcSmBfa1PSgoc74+cmrCO5Rbi00aBSI6mnBJqEv33g8uvK26mncjfmoAvq6M6dF/9sw5aNmop/BbkafbIIalUzkK+UoUywQn4KVxrTJpQifFYY3STFjx+0GyHXf5yMupCPz9q3735GwZcN/gIKTE6dw73UvtMQcEBdpX8Jd6K1kYee60s6sjoHhsqwGeY8HWujRLW4ERy7Uo5yAU1UJWOzGRo0sVoSDfDaKhLJQu1rG5SYSADDUy5GA7pyhC6zbvULo78FO8HShMgVydBovcXJT+wAJJYBJM5iC38EqLTM2w72cNFdlFmEptGPrbqIUFD2yUtPBHm83vbe4ixCjq2vBbLbPWWGH2nJ/N2TdHZ6uTePDYNwHoPdon/h6TBRH3Uh3mT43pEXSJOYX3cJZm3P5r0E+0n09wb7iESRkv5+6J+QBXHdInaEPzeCM9k+9GL7LHV0bj37XqLXc9MjidYk3AK6+8gLNw3cRITwNYqvKSi9nRNXMFayFP8RLbH3+C4dBrGagYUZoNLk+1+jz4+vXdLX33DEGLE/lsuDlxlzLqupXpKj2j+75LmDze14S/yTx8yXXMJBzUPuXDdpoIxk21ua3fcCuIH3fez9d1ZQ4vlZgqD0Z7LJIw/cFxzt7o/c/y5T+tL+U6FTydE6wlpmYfKJHrtkhO1IY4mjSLBSgAICWkeE7QsQm3mw+vZpfE86o5P5F72IalCXhQwxku3GWGtRkn7y2k6ZvdpispzVOJXuK/yadtgSFUrXR41o+B3LxIyLj8SyFyja1wq8THYR605qXm/hM9x9cMa/yZHsW7jJLr+/Ly8Bhealzb06FSOBWBcpIhAIFgOWr6k+n74prThvHH/T1KR4nvZgjxo9i9l7NreSONHgt85D19hdQynuPWBTvYhlPy0cXQM29tHWYpaVolyt6QGa0gxsjtqqN4FXbuBXIdcOJpE+JpowLJahU55rk9lnKespwJo3ZP2/DBJF8q2WqGwxJoUL2GpevjCQMyxhwZ7FIsmi4JeY68OIm4r2tfrR/ZPFtWSzRnCaA4+Z3VHxYwWyDyIrP/9U/BW/LTfwYJJoaISiavTKKHPJRXehYwIvdtRLhWVrXurqzfHRskfMwO9Lj/yluUUdXW2l/a1KndVExBPRv9wLDjoT8IqDqH5KZTuZ9k0h++b5yEG5WtZ4yzejLCAb8MILd1XXU2KsIIXUWtl/FLDEo25tvjLEWCjGfxaju2NrUtX1FeTHzu3Vf3oh40d3wM27Inh304jptmrcNaiGmwRp/OxybCi8uN/d3jf72xnU904qT+3WOHyXl7zxhl08Xlxx0wHotRz0AQw7t2NO8a5DLgsUE6Qx1WZcdVOrH18qs55GOeT/WK0yAqQ5FA7YXqcHrr43eUZeV7Gbw5NIdBmxNcpxgs1fEtKeqfw4Yq2HjTE5Pqh5zNMcEdA17Hep2hFdTNp17n+8yBEtw5Nnn17gV/QBpMVt05CWtMgEteQq1QxyNldIHZz+oXIx8LS+yUQPOhmnGRRSefxh7W9gy/eaBXYxaHdM27/jJMnxN/XaPf/OY1KexHgdcXLNyU1+2h7e0Ffrcid2jPsDJaAGNxUVik+ehG7B+7sNlwZpZ8UtWFM/DjW7TuDfsg3bZwVayk2fhCDKVPxRkHX1IasQeFV8F3brPOCtXqUUIXGb+OXXV1Tt7vfMeaHjYNph7NSTG6oaBK82H8Hupr+LPdly/WKXZdC0pGvs+Os4s1l7YdpsbtHIHukL7ztDN3xBprwkpgTc7jkoZdyn/1SBxoaugvyanrro1lnbH3yvSCMaffMowtHns8x54e4eZOrOLnAsE7fx0uq60l7hb4rfXJdRN9OvrGT2ty9Fxf0djoDEu8VTroifgsPrejtCp6VV75QVqpIiMX1tGEJ2zyH74kKZxu7/h7i15q1VbxJG4gHJZr5l+MPTf3exT3Pp5ikUI0WfTeq9tBE+vasH3g+o76eHItirS2eeD7H+D5Ln5ef72ErOT7X9HpfaHj/DEso+qS6mTRQyLtiAyEBukJmcF2uMfzxcxYtqa8n70IgvQ2lL69+dA14x61Mjy9AFBpJFDvkZ4G3g9IvUJRo+MR7WbHZ+mPDLRUlJzn1LczZCixGMQRIqW0EJlzzU/QDRS38uVGD9C0R12tfxtst37CvECcX2k5x18Mnz5XysBWtiEbBBO9f/vXwCR++2TLUVlakhICsRKoFhoPvbPk4+ftH6kLDv7gIYk5F+LFE1mZwW4xJkG5BLMpacWv/O2jPcHl1k2ZWZGNo3hndI/rf//a1HcBGD5CvKM0UhCN8AodVW5tFXvFXGJf6Rhj5gviGc4RE8v7QCi1Po04DbF6f7et7H/SfDrLR0K9tjs6p7qsZiTnhjfzbNdu21+4tNeqIXB9T+q/l/RdZH/9VUsqFUobVaMy28fdmKZ6sk+sp1yA1BAhMMGJLQI7D7w/rRto3ivcYXKboFkQyy9kvz6SIfH1d6VDEQDa8GSdZXdFx/GH5f+NDzKzGXNjvwU0ZqX5elx/7JuRU9bYEhIfzQDXHiBd/pn8DF44viUh5tMm9i6SlHioTaO9vUV24y9JZisrzhEQC1k/nWpvfEU191HOpstPG+D4f6oaYpFubWPzySGBE6d2Mk6yrrFn/SDuiVKF++do0SD/6yiPfJJlkgqgJR2HMvuEUfacS/9/6qNuYXCct81CeQIuhOUakAcrjbwn2zQrmyHMroq0ua/jNIy4nb6kPcuMYs3vqR1jagWykZZ4Qv/FQnUIfSMsQR1A9CzQbaut5/MV2n6WqPEtI9D/2e2/vZ5FN8Qw9a0raAn5xnq7Eq32QbrLKrPdgc6s0S/4aSigfnh6BOgxXtreop+Ebg7PqvDDvvVYiVGA6OcIOYMOHyFek1eXV2P5uq3Ubq2l+BY/JkKp0UCqgrrZeXeHFsw8DxnSsyHOrrP7jMDkl3erQgtoxN1mj+XV3xwfSPkm7d1pQhr/vfDfgfgzZOzB3BiG+XchJ3yZ91nhVYXLVxf6WhOtAW0WGRFskhq74Z9Ssw2RIXPtqqKH4R1uxuk89n2LO4aBExKXu7ZGx8C4cBKIIc3WW2ytQRIV3t97gekm5CR14NsHuIbQ0NqH2WuG8IOuvNPKn48ZoLQbFqL/2Q0/+HH5c+Yd1JZvRxuqS2Bpv6WTSZH1gRu5o0EypTCD9wfGX5VXRI6Z4xBsjkqWR0e2es823O7OLYdMIO7SgvfHxscrIgm8n/rIYGhWu8fSXsCftttTU4qNearog0yZCcgSDHyuISMvR39E6uzy5FNmpH8TyIR13FJ58EdtL1M174/l06hWq/8lxRHVuTwe+a/B5KrvYJz1iUCbKX9Y7iWH8m2SgOr3+LZYL2MR0pIkohyj2QbwwlinOmSasjG1Nr3zeWSNauLPUZ816RaXl6L/Qqqud3S4jyiP2xtyvyGmNz3upH1y2WFNugJl2tV2FZa3tvk7pnVQC+kFyUnfzSEYsoRaCivruMt797UzHW9CLJ55PMd/LE65Cvmd3jI7MxchY1b75JzqCZL3u6J8mWfuUQ8ZtsL1jB//m9rbPfHv8W1Fy75wSKJZHIvcr/KS6nrSt7NBme7ik1ZhIX1KOjWEIBDGSrGnCysjm+w+fNt69C84G/SsZhixx3EDUTKADvR4bG8kVsqIPKlK5sra2fW42QfF7LOowkjXHSV6yZQ5ylNlX3hjB4gkiK4yPrs+Y9PoJLvtOVvwYXF5MJN+/X5QvfZ4iGvF8t0lA4DweMUSITsXbptV4PGlBkI8cAufc6ecmnDb2bnlw4DXb3bfjE0PAaJUBP0eSjgYzHbOUMBiqb2/xtc0q+IiR6aIQ4Wj/6PDbuuHavNLUOHXf1jh/DovHY0ozp89Wxr5Oz3/amhh/PDyvd7VF2f2CcXBjYpzXc6Wj29MgjsETnLxke6R17sOUMvDK1T936MS5u/C7XjBOMvUw8JSioCLbk/Wsvn4It38cKXvnS3nG5U6XqbmOwu47zExfDwRYybrYoYP++8kkRgsgG2l98mXhh7U+6OlKg0NnqV+nR0HG5LhTppn5izecHbaqA16b+gC96nOfkoLrfWOzrAweW0WKgzmREh4LUsja1aEW/skemVdjvY7guAqvQnWjGkJy9Xz3LoPiTTkrX9FZ81kQ17uTWKYIWWh9OrrSF8fTuioXSIjWK/I/4LvCEnL09+n7KmRq7pdwe923tPYrUb/Ay/FTJMRQH2ECNQAJYxe8/hB451Mtgw2Qpt/ZQgsXvBTivbPSSWmZCE54JLnQNF1vFKcc8lCb2VNhZM//ZOTpwj8LdUyRRkpJe9qq8ynQyP04Zww/TBgMxMZTZuCKOE1zN4OlkREpWuek/FFMDKitrgiYEU+b04Onb0YqNFXncYJ+RnungsJjDnBTaDhlLW3B962RETx449ETkgzJ1lrKX/wSbM+MkNJCT+kjx45aDEVCPLm2U4CAK2+VQG2kQkXNS71bRwpGyQhom4FXgKEpzZGdIRGhIGr1rk6WJ1x1vVYInZPu3olldv94duaWfnDXe/+YtvSfLGjwEVLN4LOZT8+Bc7y6cnkNUvnTI8CRTBAyueNjYtlzyGDCFLLw+ZWeHuTlBP3McVkYf8w5RpGeruMyESVr6Tbd5AWt1MexjEZFhtuQwehEEj/mkAkJktMRIXxonXN1r/H104Ku9uhdc6xJ9hBzvZdvunJ41kCY14T+4teVFtfQY/HUR6T3SHOCpP32jZu+GrxhvxT2LqysQnSg/hgz3sjpS/E/S4jbksRhm1pY+L+AP0xtPsHPNIvbJg7/k72PSiUkCy0g/3cCVf//ALO4vJn7UcH/kVOsI/m2+sCrAwO1ksOQZcr61vny5qnrFgFvj4lEmL3HudUEZxWZWeQnOwnSQ/VUA2gWZHOkp6mBR0RpoFiY6GgX1GCm7SY1KSBoHmKa6oaJamMAoueuN9/15mLOxTnIxYwaeRVXQoYX2UTh82Plo/2xKofJUygfVW7MH4rTUn2TXfj8pB/EnDnq/BB0Wqtzocv2MSoHnWoMrJTgdlmq9D2WUEgOKtsxygQewH7u7R0A+1L9W0BYaEoUrY6q9qttk/D9D4LyOCi89u3XRrsSjQkVGwI6ptPzEH7N6D2jWa+SztNINskeTfiHYCTzFRPJu/bQmHE9MGCNcwE01AZdNhRKDu37N8Jg4ClM7+Y1DnOdYMNAxWGuoRrpFl2I2sygispKE4UpccJG4XsbBZcmDEM8Jzie2gS1NNGjRVMUUBvZOTN+eCW3X3mxh2T/dp/+5TUw/usIyds0ZcbsTJeo4fQupuh2pi5Kc+Om+jLeLh82IMlA0M/jEHTzPFK+Q9oD9CjjY9x+5WMekr1xQXftg7aMahQZH6r/HmBBUCLZe8yVtB+KhpX0wPhVyOVGDoqQz9ILAl9JeqH8X8Yn+dEICJy36bspAZEyzW9dT6eQbDo9JPvnZa5NBDrzRrKpwKHOFWsq+kNpO9/N22hCpN5jws7tCTMCZ2rg5Cn7/1l6Aee57FqspVQ+ViaGSqn2gIav31SADoZC35sfAywffFPgKxmeUn63zHVJcANPeu9tNNH8g/oITbpUxYawajb7YK41bP0xPaf1JR58A0j8nKb3c+ZpX9l0V5Xz+BMKyU9vUnCDHbQHudCR5zoGhPtdAIpljosGafjOtNdNFh5P8T9I8+Z1NGXKjDzxcpXsXURDc9mfNc0iETmdknIHPZh/g/pbaIJRXVG3nYTnyF8d+lP+6lOoxmHNKkEjc43glM8GbxrpFHc5P94tCKlAD+c/OgZgvyw6KWc91qik4hLTg00FvpILU8qN/QIT5wUPaqzLWAdaUELlP8QxWnRBPPi/xj4Q8YL2+ViPuzepcOytNcEpJLu/lUj2a+W8QqaFbAaN2lf0Ua54XYqPkPZIC7n4lvegxNe0cNdfcAz27VB6ajl/D+gtQeDn0DyVs5evpGlKuYefR+dU3nFlAVOB7Zp4wimI0c2qMZ6SonKmTRp0DEs4xfVfU5Qx4xf/hRsIsKmgULxT2QHvIbkWLuwGLp5S0ecSN70gbR3rvCLZqLNOtVoRhUgnLOn+FLcYWaxwg89eijeppsf0yxERSh3vVv3fFdN0JYxX5s7sFhd1oVv9dSXFyPay6JpVXjwLZ1uWC+azIx9DOhLmaCgDUiFGGOYhApGIQjTikZIlv74Mra6ks3Vx/qTaDzLeSP/hzXS9bgnm7kOeuFNwd8FpNnHCLFZ1hg6aU2Cc9zbAeNj171RHvAtHJ6Rmk5yppvARe2FliTHL7zEhLorXz7ZkQripdqti7wg6/TYaR95qyAVSVmu1S4yniBiIo3XIMkQP3o25QEx1B1mkxprrGTPdH0zdUIBMFK0tKmCt1NR7BJWFwnVF3YoXH8rp7YZGn1B9atNb39/Q9yDDCKlUg+cIykrrDuwoncc3mmHDyOhevwcZnRJadPEU2V1kXEHgHY6uaYFUfkK4nv706fthXR0xvTf2y7Pu+rsRNNRTeupiu+xKav4ZTd9lbMyyPFD4g4al3Obitop7Xt8k+lsjpj783lSax/7wG8XvPXSRqQQ7jGTkUUc9KJoBdgf7kSUu/iz7XrPceX+c8f9rR5Vrm/+L0GszPj1U11sXu0tJU9hvvSdJh5Dxrxyp6JA9U9L6JVapw73wDWzbgtz+/QSrtWrYARJMeNe5hDPH1nQsKCw3+ztonEl768eIR8IJISMKK/SM8QIfP8jDJ6X9z4C4dQxsNhRcpszWhd8l58T/jP9yF3Kq0RCkoemFrcfWTdT0Hu26mXRlYtfjlYKgTb0QmOub7x16Et3mLu06uLiWtuQrDmZ6AHqRnnZCkglF9EV7Ootd+bw0Wr+Ag3nBQdZJpRO7S7vopZggsqM03Pm/Vr5czxkWrcsNtGQ4JUu6WNnSInQ+uLR2/ltv/xHm4k/s5jhkG+QvTu/NxdqfllKfXGFHOiZ5D6tKVDDWt/BXa6q62jdr0jery1+T8GCNOv1iP6krSSqV1+/V8cluhvnVyV6vNvLXJrG5VnZJtcavkcNfl3hcNzo4/IopkZpmNdBH+5ry92pi1dCQ0asUO3RtVqmXK2A48F306f5W0L+ex69nIKSn1ELqRCCRBNJTEFIHhIYnsL1GYl/vrYlKvZorGXNe7FPYJH388j0LbKqHBODirioaGjnKZQvTvYYlIZfYbmkM2ShssPTQhe3VAvRylMtaSwd9QKCAQAG2BU5L84jZeOEfXawYeHpQOqp8isDPoKLI+MR8YrVCYIbD8x5C0y2piKIQYdZcIwAjmvCQoUBt3WJK6gI1RrVsCqBr2m9moDKDeJmD3mXLoLVauG0ZLKylHWwZdFXtesoOcdHbOdHTNgVOW4S6agoX0QfawVFPQMqVgxn53dCnknBWxsoPubSQzRnvo2ndg+IKJeFXUSM4QpOelpqj25k7GvZaZRuFnw6NxDfOXzfpebn5OfNOqZy35IdHPMa0HSVA+QAEL2VMqs3FtydwpmgX872+2QKx395BBxzElv5vhwF29nnD+zTm45DT5/0//f/rg5cv3fp5e+p/Ov2JD/hNIpRN/O27rf5C4OYfAvEXK+dAFCVwALjr175jwIkAuB0+8DjT++ID7tbtDv7dnASu+QQnnQM435wu94b1b6nIdDDPKUXjZw3ZA3w+KR8mgzLS3soDzJNUX7pwAjHZHwy2RmJ8b8mVXOR6rs/IWI4k+U0PaExuGhTmPslB9kA2LqTRTZMHg/v0dUpE8z0IZwa2aca450ZvK/pJRrf0MFRif3Dbke7uBeyAZlsB36gbtI0eSjUmtoYqclwna9gD5cFCtUGXDibGLExScg7gZyC9oTncekwNjckkzCk285QVWySUHrMu9g3Tt0d3Bbb7rrgK2efmBPkD16T1DbBaJBJqJelYc6mG4nHr29TQTBeRlZg5YU6xmQ5zykrSy7Im7sfPSL3Le5JSGhqDyCrAb3EmM5UuASLlazh2dDYB8DeD6nyvHs7xPM4dqaHe3vgo6/HK5QVN949fWwTIp9hb0kGEuuxgTiDPr1LUFwyyzFonGT3F1uXz/OgwdXLgVvt5MzkF6bC8roYi/UzJp+47xreynHxI8f22azKPXg4vPuMg/jjPuU3Cxth09wrpaRYDyDi+J2ItpIbzAqRGwDDx2LLsUijtKJuUTYeSssmnuViqdOuKE1KrO8Z2mJM0GS5zkodLL+sVzGQZ0oFIKz6WlEyAiYqWlOW3xx6Vf3ecpmvIq6esplQEjKdGa8Y0s7oCzSk202F5v2pEwwEY8RHSLJN9LsSeCb6ShtSVup6VAWERLas4NCdkZt9FNXh2wjqWX68jbtKN8RjJE8lBX+7tSk73cZ/ShlwOEmcutslb+CVA/VDTfnIrV0pyZ57frG4A9hzzQ4eI5HGdyGOwZ9wnc9wLBuZZ8K6gleogCpvyE2bvWNLA18OcAj1FcTJun20RF+apOVIGVPLjps/ZJqkK3e6XQawNNVd3Xmv1omVMmMO69HjIp9LNhO+23hJZbpaPfU/ApxQC+YJY7fkEwX6WrLOpYFHO3fmjKjboiZBD6FRLPxXPx5F62SI1vOP9E3FBzv1KzUXj5zh/T5hDDFculHB+iMPdJYO7w3P4mGj4Suni3uB+EhPfI9aPrcB5yvUjqenBGQIebQq1d+LQEuZ9L5RNOzzd+9BZFx22NB39pL9+rHfjnpLFTpTRywf9rfJChWvOmD3kQRyqEKrQwXGF5Q+yBs8lbbvOC6cZcxiMCv+TgxmtztwtyyE+c35dLyajd4w5VmIj2rb1GA3NOWv++lPIjeetvcFvNx0bvydinfZdEfFvD2QpULIzXs/RIueezCrIJ6NXPcWqSxeUBzFwN1lO+6iedot9sHNH4HVH8KgCBailJXwX99ioWhDWJlE3+LmYSgejaQfEXBOYEWLxsxtaSlKFXTaN5UpdqzpmqT6JAT53VEPzRlnfpkea5z772bRBIFJTduj9aAX3plRDdcOtb9MjzXAn8tK0ABrrYe/qfUVF+cjlYK9kyiROB2zNi1rR4H6m5YRf0v68r6uKhKjJfSQ1gxpMcy4sAUSc+brmWfnMwCP7q5bCOTxc5LKlknqNjLaGs3g2U8M0xQycXrxuxYmseprFNEo97lhDWybAiag7H2023J4VWYrnuKGuMYCWvWqZKWPQmSQR8YBhkde09XrM1KKNBs92apiiCswlY64KcJ6U15hT+YXj2ZBm4LyBDs6SyEfWzcT5zMAjZ6uWBp6rEb5IDYcAqeE2AqQGUKq2GnlrJt5wG9YsFeT4WIugSFg8qgm6xX2fMWupuP/5Oq2tFNVAHZgsfDAMt2HNUgFj3MYiKBIWj+KTAJ4Bca7F2TTcnpWyFNT7D5lOjRVJSTU9e/ZXJjqcM7Pm+gj6vA5lSKXPl1QV2GeJxZx4l321g/0xTByR6Xtz3UmO5kDmVo20bpu7OKj+u7GmhnpN3qFBMcXmn6332cmhwDkNdRPqhulKgG/2nhi3J97uyc4xLh5uuqbZTvCObjT8g1ESRy4YkwJc7g5HY8n9vTma46uXJy1HJucmTUhxVPRXpYOHa2ge7P1hCSimzHF1ljKk/8qCd0oE748fpbh//Vs2DZ7WwkhpQ1WJ4+zqsBhT6neUwIE2jPmF50/YRWzyZjlnNOcTKR9A69abUoxh0WEuAx6Ood3e3x8O5oisiCtfV0XNIkMS4YQj0d3d6W189fJ0Kuu42F5xyvIEFwZYmFp2eMH4dlrYsxlPQbnBqyset5LnnyH/ZqhjHCDtM26Ew7WBozk2h2Ov2k0Tu0Z/7MRHUskFPuD1JrW9vbq+6Sa/ZTn0XE/bqxuOBzP84xfIxcUtfr2TPxdSyre3eGNTS5uV25/6AG/4/X6X1dBeNO7k83xe31xbf7HnM/TXvp/37PVxW91e0ZsL3DSovhhv7CjeGulL+eylzbDdAgYYIpyejH+EIGFnPfXjSbmMMUdOFBUiZFgSPDjVH5ehiFjgT51jyQUKo5ZoyVrPKiDhg2Ke4ibHGFPCQCXbf9+S8UNCHFzeg0t0BzsDvz2BkASlD/PL+d98+GFFUTwUGSEII/yIWAimZS424QAlG/1KgED1KjxFQOdAmMgNFh8UktK6Bek9HBrh3yFSaqodWwMy5BUIoMEYMSdWNI97sJt6vxTv/2DctO6SpC49XQwmf8ekyR0hdz+FNCq1wb3gOXEmuUt7ANayW/H9BcamiV/QNPlmMx7OTZp3Mcd8tMNnhletKkGwJuXBGAMtjrDB3hH8lxtRY7KJtajUk8rqEWOtw9HctAsc43hGkcI7j9na0HEB5h0AfgvtTwmcZzMfV4ZRZAZZb1Z5DiAT7rZ5XVXnL6iqJUlU60m6NK+ItZku5DwdlQMKOKGgsMfkJ8hpmRULBJjV5Xrmd6/SEvN8fV0AvNEhTXeQp1gLPEm5gZqlV1LCyQIfeLGTalVTeEtTilbfvsOnGH6Gf1p0g5RtYR+r+mdUGmfkTpE7ZU+m6D0rzZaC7/wXHgt5a2tW/eMOX72//2F3BpMRQNb/jBvhe/wmvqP/TyK4vN+Tg/j9oSkQW2D5DSUIv1HkQr4Y3wyKp/x5oP6hC7XfasKceArqeV8Hk3noIZ2hmge6v6AxaoA3WudvaboZf8bGgeOzbs5tFsse/rz+szR8Uq1fQLWE/Qv+15+s+E9j7prPPqNF+ma6w901HI4IVI/s8jXHQuwRebghZxmUGB1ryE0nrZIbpQR4SEapn+IPzjDcWC5rOha66xQNqfHLKmu1bt+itQLYPwPY7p5R9krcXBKVtRW71sEzR6VXIdlR6ErrJTVg6IbJG4Zc4o6oTRgpMQUfI0Kyi3i7cTdH50TrCWLkHRMbVBSSZABkRYqJB1L9E3nvcHDyFGHwqGWuJxk1icuScFfSUw/dMwCSUo96QWVTO8lcIF8GTkZZDBEEcgl0k2USPaEM84v3Cm1pnyWRQkrkKBdjz9/+HCMhfdKyy8Cx+cJ5FJrnpFpLIBBeDetQl1ERHi8kglSvDzjJVbpKKgWW1LN1jIh2RRBQjwKJllaLA41sUdWygHBBxHsrtPnECvRJCap/4w34PVbsybUk6RowqoYAs0UZukAMrQjejmEsrUs+gMO+Ff4ZQampHaHDStxRkCTrhrUu6JFYFOpH6mhI6mjKRm6lGSW/gc6BfeT7oWyPPiUVJWUPOPib9Q+JZ6qkzHqqawcVeG+78zQGK8A+AchLYWV2I9fHTmfdR0S9wz0J95bZCPTdVi7Q++4ZT9H0RMAgbA8qECRPFnCkyGEVRS9Ji67XQ9GkCAFnawRK9Vm2HZ2ejokBCiMb1WIETDRqGy83HHpCYJ+L7mvWD6WU3JuBjQvNGsyPtUSMVmRsT87EGwcTsKiemGkJH2IKJTufgchN3ycYJAkKq0heCUrRQFBJ1Bxiy1m5NDhwrJyisgjnlB4XEEOKYA4MARBBGu2PQMEjwl1RHG3YcaPzbU4QiNA5Q0D5iS8DlBipgLEYABXimACvs72P0sCDfk/MMTp4QyPsE/0hYIryGbh0xzPIzLMkycPUb7Js6XF/kbCdXP4EKWUHPuozUbPhDAt/SMTm3t+pPS910Rgsz1imRE/LzHDIkFaoHwHN+0e4KBhoSJKj6Fh6iRQGxsCLpagG/YCHNr0YVqujwJzrPVb0tBQGeIa28q4TXaabHWjV5k1REMUJF0NTnMlmaBKNTQPcr2dhd6mu2MFMBifnkmFZ12niCEhoF9Af6HFcEFzIWVoreN+6YXmoX2FNjvLldbL9K3a/ldOdu2mBze205f/ut8qy//gJWbbth0+U+qdHlNr2+79++w97fZ187lqFw+eEXj2zKgkj/GxAWp0DcAi0YhYh7oLKZ8ceOV0AxjVK8F8KF35eh9IcGBAnXU7pIU3+lN/kt/m9/lL/n/5Fh7qGKzw8HN7vP/60PB9bl+eFSPWuDaeFnvRBfyG+Et/1Z/2N+CtGFfVMgXwE+oCB/R0vWzzMKEEvNZtFYtEoXVVBmaNL4JpXnP11RPr1pxEgggYK0rsxG3oHgDCMjfGI201d5lOhTrztkhn2KBrtNDd4fIf+RMTCNFvMeoiweAR6N+5EoYAkB5BS6QQpbDF3j+Qaldohhk5tWoa3l55NauYVFlDr8kilM6VH6FFNtmIGJfYmG48Bu67N1UGt5q6PagrS2hSdVksQJeYCgcF7U4V+Li4OU6hff2XQ4eHu4T4jveO8HI4G+BToepX3WNftE7XG7HVnCNgGJ6bkPJSIE42hVB/KStWG8wmV8pAQALfKz3L2t+SkLGJMXWRLFnzChlCwsmpZZDhPM5D3aCJ3GIOtUX6pxpvAuh9PTHjIz6VkAdFZmmk9Drlgq7uBTSOUO8xW0VMcCt7HY21ebEq6WcriMCZA8Zo8f38ZJcYW0noIbp3TYAjA1njztPYZtDw9IqMA6NMvtOLIGLQOvVoVel1BP1tV0dik0tUPSTPguDBJ0uj3+I5+Sf9E/5WKKO7bIi8oCh90yWx2btLu2QWLsxOAeIAK9N7SSFcWCsBHXE6y71X3rfvd3drdp3dv3B9d5ygOF4GWwn3FucJdqDhNpvj3wGiTCJr4aaKjj88f+AP/ZlIPowKM7iagmw/iz1o1oUqT6IgmDVCYLatu6lDrpkqSky1joQ90XLDEHd4BSU+SjgkfKveO4heV1Kzw/uMgb4X6p6sy9pOQNxdylxVpp1wiuosNn8aiaZsvyNSBFHRoLYD8CNJZWfVTtoHRdN1gsTsZ4ZMoVtUA4MRy7S52+eXeAFEmYeHBb1X6kH6TqPzKI3+Q1m1O6SHtWKRcxgU0fNpEbp39EsA2Ty4RNDvp86rVX6SqZVy5pBHIM9GOiTH7VVxgIsJsgZiY45D9wNgxvvK1evk67voXYNhd+ykCSdq1/Zz9+Z9h+2l9d8XHLGs/yMh58zmjbaiLDDh9Y03l4DCgbRSuAi7sYyU1qst0EYVa4sQ++xRgaGbktHuu8oP8PmPOL8eeXq9JOHjkC5hP+1eQpzn2aTpFXK/mopgXBIA7TbjO9In4/xo++hfuMqzXkMfyTpjMuHiuLUtAuBw/yCUeFwTIl9mSmX5zoIR9+yEf/BlnT0U67AxdmxfjLghZpzDyTz9RAKNU02QSY7qsob/A1V1Hr1atYzWlPwDg3QsSsePodLwE17tWi4AU604jLSTzwrlRQpJJyxLapSX1xO/JWGa/KtO48UmSp0CbKKqHxHuyBE3dkrX7U4mgOfg0j8jfbtC5qSb7tnUtunmqxFPzQnszgWHppy5w9oKcSZjA+xCyrjVF5XdKrKGvko+qdZGL6Qi030dgAUk0acJCqFLpkwouJoPVXRvzjxLZIyBcxCFYSkYAyTRbqT5cqtelqrpjBRePizxSnnGxEQajGj5ScW6wZiMSqypjKYFPVUAdE1rFEOUOcSVqIdgBqYvmawuIWUaffxPjz6K/pWRq4OHNm984nez6rSOafeinclhBnzrXr/ByT2OEXvdJQcdeb7fTz9gyRXlXji2XJfo1futatoPrN0lxsDZdv6PkbezudFHyBusw8yPunDF5VTEAiwDmbpmv8/Imz9F33CStE2QIx531RByxkiptcPQqWKojDcAS/Ragp0mi190decpScmanooSRhUCB/UK71vPU39g0ZbNpcwrkTaREKx7JjT9t3fbcnBQ3wWWX2b4znhaERM1t2M0FvtoSgMPhPftXk1WI40TroYYhBwmxydtNHMNE51bZjDGV8kQcbIcOnjsvOACpoKOtp8ng2BnBL7rLavucCgOlMRrOXRC+NIgukkxmXgvflOXWRX5AgINBQjxP4fKzBf7QVje3UC3TLXvzut2aV7f+1f6RV2DiGeM70prTaTf/paFJ8YgOOJr3HwY+bF/P/HQ9q0BvX4dw+8ZfAMS1u2X3n6l5U9LvfgKl0eV1+JzXrys0r86U6StT6rF5YnN5ZtwEwC//XZCgU4++DXOPoqC+4lbcBvf1tP1t7LdYivQk0ngAAof6V97JYYAVB99dwy73oTWVZlGppfdP8eEJIWhXE3z7BK2DPwyBzybPoNMuXIhDvikproKjrrZvqjm5QecUiDtdDGl5cKXjpt0sX7ULEILdstyDldPW09Q7UBvU0ZMafLOOpMOjU+P8uHIB1y4tiWb8Fw8ylbgxckonLofvqGpd8/VKeoET6B7DI6jF4hGB9gmaTFfd7twChROQXNVCs+4ie4ErxYntOys5Rt/Pnf/H6U7odknLuQw7xLoGerkXHfCtUvUHTqkHdVA4o2p+gsbz9SO7Dm7p7KPByeOLP8nvnDcuQNyB19vGibCuZECZzYBni2H2F0pf0vN3bPy7gc7n+6afogTSte60AVMjEy49YhbMsSU+NBgKmT4BLaXVXfosRmErFOOpibFVYhqnuacpNwTqVDeUvbjA80yXU5MPtSzzD0xZntTAHqmB/PL06emN/8//709w0sNywGHIFcOhBNHy/Nyuh+6vSb5sdTvKhooqT9rBnxKph3Woa7hUsbW2SaeAUXQJeuidmdibtOpJgQ1jE1uJchKn1WZe6WK/QbHtXhinIqUpAZAVbhVZI7sPK/v5nCQKAYQg8epkGrV3H69CfRFVcJ8dEpwfw99hoMDY1NET/SK/yptzVYkgK3i3eYXQ1rIQF3niURtCl4XQqAVvSKO2x6HPnQoa1QARODozVcAjUdovIbUXusdpdDoapX0sHkXtNmJ7Pk+BmdPbjNgsDMb6NeQEvhSMFWxKaLNbNBz8tKDzUlkvlo4pVd1WICQg4awTh71ajbYZmQBCOLuEL8vkzW1db164MU3nbkPvXpUJx+/qM/J2uE003t7SvH19RuXxi0dyDfEJoPz0CA36pEdFYqZgZpZiUkzziSl2xYUi8MKuH+xVPi+44kLK7SmRDACBZY1VJq2+fSIpBxxFGvQmAwdKQ/Ogtf1kU5lY077Pk5ja1vJptPXJawqZ0w+k9EsVa0nhsbYL5fzKWfnAQpRNJM+6doi3Jh9rfoLJv5jk6N7kAi5VjzDuMjsrB/wPJio9M3PfEHciHyWKUabUaZETMdfCawYfSQp5UVzBpdzJccwwxHlg81IsusUZ2XUadHhEp32AMLOzHulFgkcYNQCJD2mqY7MoXh6a08yd7ap6+5ZaJPRt5M/iTbyBqldJ/eOve5pqqc/zKrQTGX7T6lOwLHK4fk/yBZUoD5blVU7eY82ayz/G0ciJHICQxOXCjFZuJ4q/mUrUm+VEQjjCIDhTYbYyqJEpAmFe2CY8FfYLDAIVqkmn5G+AFpHwC/exdcvmixu3c4wEl+lYYPMsQKvtaDzfGjNKAIWqyBxk2OeNlakWZ58F4HLXfZRHOBmV0VTQFDVRqwE+M5sXjwzEclwiDOQxX09VFJIpU1fF70fCn0M5uT9qfIE/6J7uXPexQlPC4Bz2Uf19kWYP4iDQlhK282EwFvdFlBVEjpWGSb5OohUuFhCSHpxtXZrNWQwaWIIE6ff7d/OU+4cAl+7HKws/YHi/QlNgq7y4kn628yKPSCOMcYqpx0gnoFgZuvU6pxaPdDU3pREhLUW4GBrODg7HH0vM997IjP/GOZjKzIxv+NY8VLy3812/AKVlveb3lOCV9b5JrlOK6nmAXy4dTobUGKjOiWP4VcLEi9lfYFgCwWbmY19CSzlYYAFKwFrwZB5tsqcT13g80+QoJC75sRsis2qdYky8k7mtqFUhWrPRAsrgqB+bwajTzBIRKAKQtyKtOjNg0pLaMM34LHxvgvs4YsdQx2u6Wgl6ulCinfD2Jtu4zVuiA6ddohG+ya/fMudf9tedzLnLxUrFrASQawkVtH/1/g8+ce4Q49oxftczXrLPR1wM3mTmGZoFf+ekKYntbVyICu8nlYUu5/cOSx/K3HR8Xmp4xq5p6Isi2E0rmhRxlL/xlVM9nxmp7+7eGPGWyizAlHY05x+mWzVtexkQ74Vq9yu8vQlX0jYKRpm7W3pBtu6k9miu0coWsUD3rLHLgvxTwod2Zhc7Nk7T+Milq4B2hCcjkPZqxAWcSuGDqdMCU2eArXOG0tHnFBfFGgbt4RyyZ1QuoJcf/gyjSs5+0yfZ2tPrKwvz3DCWrxjsLx5pNrjq3ONVtdzPqFt6piC24Tu+3TiyXidncj2sE43WK182zfhEo2V6Jb2kfGDi0GMTEyTv4VhCWSJdr6Y8X3EVTe3rJzx0YZnY7ku3I3CAN/WYLP8hKY5KwaZ11d5Ov5GeCAGFzWcEoQxaDdPQZBLnUIpvFU5iZGamjX6Xbtwrcl4BaFtHulmP05TDmrOPcrK3J3koHFja/gFaKT1CyuTS0bhoASxTpvTrnvK0h+1ud3m5dnwA8Lnt1/zwYnlzU+5oG0J7JoRyt9JClnxVnlDSrczOLG0vZyfI6kK6XEfNYpDe5VWvnmjF4SqREb7MZa0s7MBzYTHCeeEjxxqPlQEsWzHaAJjOndf6lH2ufzKlKMypa3AaqdYhX4WeFgTN1pxUPHk/SKkLVAqa6NjJKOITQvHEIuVALcSOW5gUqUyMzhbKVpxOpQI1ncFdaV1pLR3HGWNQtIEtiJDveCjXzXySTZNCPLicAs+4XnENvR7OaD1Jkq8iCeA/Tsg1aL0zA+2AG8ps8S2vzjzVesZViLNnTUZ3XO16GAgTkpGf3PRgJnaR453J8Ph7LUhbUtWmIXDcXK5mHPoO0kWpI2l1+0Spm+TWaQ/pvb4mRdf3cdwYo1PuI1Ef8WK34VpDx9VSQrmaT0rgDiAHO7p4T5lHHC96MQu/MeIkTtYD45htzXrBOZU21T2bxlA+C8Eq640Fv6Wd2RxuCkMqZPXlcqcIuZ+onCIdeuSTfryuHlBPQjXCiqU3a0AzQex7yv0SbfHtJq6dF3Hqae8gDnuuujzKCW2YnTEYayIA4ZcWLVQDcKD7QfXPqCL5m6LgYhQGdY5n5TSDut34A6WNnN0IXMW9quWZ+rpiN1UVQUcpot3kOtlwxxNlqanG3u9kCwiCXhlYcvRELyyLGLOHa8RRJMKx8s1NyeBprTNHNwyQtCPQiiAZOpWKbPCKJyILsg9F1lqUL7Ti0u0nKKAEClmG3IhH5pSeb4IXoEJVg8MUuyFZrBNzVkjyTQCmlCLVNOEDoXuynnxiHcRa1+TBpsCat5lf7DDEGN4SY75eL7S+pnnnXcgdhXvaVpnGaE0QwWCYivUUKHYr1M1Ihh4LXMvJnQd6ohLxZPBr5eQ0Rg6CVWPnZs/z+DYB6iA6OkssrPJATLMay6ddT9IJoCqEUmfWxNJaFiqU6BOZUhl730JJ21gNmLZAxgLsApmwgZ4hBKIZbBsSNlWCBtiL4RCIX+riY2YDckRJFCwIi1XodcRNmzpeSiGh6qFkY2+FJ10lkfSFQrZ8I1oQWwDJvCZLDH7yc8SFYPX75KQ0YHMFfVDsawWa0iNdC7aNzvAbTXljuFpaDFtu5X6niLUMa526kUnNaKLFY11nGMpK+y54QagXTEBHGU3nSAttpXjZgit5DsHAPD6jaHojpUWyoQdZejVuviNcd94Os4POfFFEgokRB04i7wLCAm/VdVa4kVUOn2zIpsaos8VyCaj9pTbrwit1ekpcOcO1eUyhwMeUrD/TNboAlT86l4OP9Dgltu/tGdkPfaLR0vMi3RW9UHFWO597+ZMITxwSoxiIaEXXxgoLqKSkrLnnLiVgtcTMkgl7zvWZXKkFXr+8S+i3U6spC+opxgZp0mUlmmrHNx+EbF5aq4xdFaGuG4peBgV8DCzPLiu7a9dBUqvGK2fIc3HmOvQrGYxWQTUTDKGE4rsqiJ6oNi1kJfHeI6oWqGlMIEzRea9IGiISXfllgdBYV4ZaUqNhiFfYCtyAPq5AiAelhH7ZsRgT6PEmaKLOgAZ1qtThKd4hkxqchHtBaXS3UjKGK0IiJWqgOfq9hJIQ8R4tOL+m1LmjVBncPSpSZOyzgdeEq/+2CbvQaqnWBaUsB7ACxOhpWYIchyDDE0r2hef+CeQSGFXD+MZzh4PJ2Gtzd230jK4r5ivgeTScjKgdxzSqil5VgR+nQ+Ura9JAdasYR/kE1wIjf0RidqNjUoCVWqq2xY8BmWS8vfKOS4bDCmaJNk/MGUIs53QllY0zwssMA31fg9ZZnUEJUK8AwibU6jNtbS/zTLyHtGiO0JoqLQ6qn3draNqymJpsb4yXeapbkvVAu1Zkr6Q4iaSjMJhd+cRpYChgSIesxuD53oRrz0kmHUWxvdmKHpFGj8sGwpP7HE3KkSZTBRAlFt7HpJzKM2OgHtesPq+MSvNKj3N6STehXWA1S9lPm2bD9hcLNbfGms8J1s71nD9SM/nl06dPb5J/yf9kgic9L2cU9DSrGtRqf6aNzwxOU5QsRpgklZUxiKGd6bmVcVSnyqWq4H1CfKXqdAD9NJum1osFJBVCXehqNrycUFWnVwruzVbwuPHRBuW8pKMamiZTKWUOmU6bFM8dqkV90TiVKq9Z0/Gyu3k/AiptBnlFlV86K1gJQNM4gi0+A15l1FdT1mMhBxwLTwmHohiJndPwpGb9A+d5GBXJz3R2uDrQq1V5H4g84cbl7jxITD7R+Kx/BznBv/e3iNY6qr+PCvVBFo9ZfjDV0yQl8y64z0jwj7/udYp8HcwbZ9Ru4fwDLtfHH7pBGkLe3XpEVMUCcMgsJPDxR/Seg7IXf8BRrJ9Ood8ABwcWSHmeqUhLEJJUuCteXYyoFqM8aZHHj5lbjZRl2R+aMNObwSty65xQDRa90+aKaUyA7MV7CV57QgpABB7Zz1A+1Xun8uYx1dZN7WUMzIWeZxYDR4dgPqiGG5VipTpZVxc8l5JvviyJFi3SQIaVGFcjA79E4u/4FEb11thYmQx5j9tNrzAws2X2GaUCMJ33qF60ITbLbXf9yZ+//OsfBUyFCc32+s//+tfTf/XZZ7f/+L/0t98Wv76SP1dS677FxmaOLo7H/V/xzmtitN1kkpFSJx6jd+wpqCBc4p/J54sBHH9KFDRZJ+hc/I5GClTvLH66zGBQ8SFqJxVYJG7MvB+BqB50VFoLotKlUNRHPQ36SzRmQWqd3k3zuuzz8mZ1zuc0U0+gJZ7TD8arLOeHps/L+y4pZ9/1fLMuFuPiSzJ1nsbD+E9nlaBzK7u2661VbVtjmbvX2tSGcuu4Z1oeFhRgDTJRYSG9ZA6LtA6brv3UdT2m1n3PL/eZqcyXFFU9DlP7jmka+ma4eMfAGfyMxfBmenTsRarqTmII24Q9y6emX2zS/QV/Xgbro2hi804qcUdqjNGtVvDOKnXVO66ddMwfqb3g2tsgoFuozncDJBxP81X64nYPLWlbDGXpiNzYTGjThQAgFX/OpLOTDxHps27bgqayo7st4pKu9Fi1RVXKAulhrNPiIAUpXXmde8DSC0fvZksaQkFqBTNeThW0h8srfnuDxZfZtp3w4G7ezb7K6Kv9nqSjL0AKmGAT6oUngqBGpq5dk2klcwEk9KU73rUp0qLLDBBxM5XgjVw5PgyS26eouprcyPJhojSvcnKZw/QwJVM9ZQaGTEHM3jvkU7ZTf8fo7lp4eEPSaMP2L/i06W9nfsoiIflkuRy4XoFafXvGeyWMPxJpe1C7pEKAeNVeQnwkAyBPrXpBIjARc0nQiBl+sKJRQEqsPKek+x3zHXx3LpmSIarBVOl0IcBOtp0GYHQyuPQ3E6ZO5z4Wo0emwKp1Al6cI0+mIRJz8BjgcuhAxFFMag0tcOxLWOQgse3W/PZGTY/R8q6uMX3sOvNQfrt/X7CAeNQ+rLnBiTx4Q+ZiRjVjE40cGEBcDQzNcqjuLujLw26BpruseHxHHpPofHG5Vp1wqS979V8tTkF8hdViWjwsvgq+Ddgi7AOkLZrrP0SByCkk1qI4qAMk4KdU52WK2QVucyL9WhOYKIu0n5ZIvczMwm+UuIgv6puidhYRwJDHOeQOi09ND+jvpVFy0gd6pfgeCByP8GfTJZoRop/+5fXwnhNPuSIx+glRYZuI24DCeGIQvNSiRIDysJyka4Vm2AG6Jzs2CJsJnWPYGzBGF1y08JkA3ncKSzclgjTxpD4zXNJPy+g05jzDZGQMwk1YkfbZYLW9EQST8sSBPc2WMPEWyLBJio9VelZpc/vZlswVKabCY+1RLFjhs/mhhzCWPDaA/I7s+/i9nYvCqbT0dlOMoLpKHpzhQ+N/CtXxhvaDF0Q8LErR8Zhgs5hOXT5lZnlJs/ot7upFFis0Kk7j5eFyaRhNLzB1xezIZa8W9buoQd26jhZY1uNHpR4SL8VHnDJk+WxSI+THR7ednxw8ffrAirw8h+kDwUi00dTZ7Q6gTqVLZamqM5tN6Mh7BBwb3B4K+uOJmWyuKM9tmxy4cnOD5f7GGnNhU+/U4CBy8ODq6QMnb62eewcWVo8eQA5gbiTBcOs4MFhFVoHeHgxFmTRXFqu1Zmv1AFPJEOuadljc3GaqZa+P8+s3n91nlDEjXA6YS7kkHt5vrt+LD0L7uBiandHwlsFn8ifoc8CPxZZOdCSYppHdXO/HulqNVXVeYQJwOcR7OfRQHAUn/FajmdnJzXg5Jncbn+eHNNG+uWafvLm5ur46s7y2Cl7Y8glYYtFaki4O+gVhJ5WfmZBmigTZYVaJB8ZYX2e2xhi0Axg174fknzCq7VIbF7UmXrvXF8W2dOO48Cwiio+p3KeXe5ctFpCllWf+KlPPHXRPaMgM3mE8GwXOyE7ZpRGJrbdtJx8JVPbQ+F8R+VN8T8nvQahhgn4jicHl5/2Pwz6tQMOkBXAhL6zvYlroX0RNe/fjuEkdbtW4AnztmsPj5Aqs9qGGhQ4a70H4Bv+LczB0R9CoOvElaLd2ATFN4c3al9jzUy9jWsWOzwe2abwulYhyj/uiNqboO2pPn/NPCKkHi9XmnYNuh7nRPSTgsrkix7YlpjZjkZ2z5RTF6cBsWfyEuobwUDzDcor0m2zAb6JiuPwojSf6FcEluCRfR5f2N1eneK2vr/cv83Wg+Tas3fQO1+3lpWth2S6fSVt6u3O7Z0rn3H7m11+BxA68iaHqgA9X5A7Rxzo3fOhF09icNNlVaMZH4t0DDHMvZWGWLCMjpaNz1rYNgy4GQFvL6MSKx1JLQhpiIkSrYHMjV2CCR/Bej8BaSUWWQm60ixkNcaJ9Vxa42fJ6QoKY3CTegoI7GwlzzIorgcf1+qRDfuC2qWtP5fAjW83cNe4ZbBof0NsBng1U2Y3yVPC1Abw3dD5vcoxcKUe+7UY2Lxsq+MpveppfSwt9t0LvXsqW73nWILXYodAQfO60xBQWp1OBkuWTpSQ5q1EiZRr42d7nv79V84eOaM2WXDykXFoYJuHZv8IyfYHDqkSbKPg2PLKr0enUaA+OZW2hTZrQbHlaY0ykaTRs6JtCCpo/u6VeGrzJqWuJpDP6UNU4YUMz1d8JJ6ETWdzc39+ZqPHeQeMW72NxKssqrRpSHbVv+mm12ZKdGfmkNsYlPFJdVePUiVDjMez4T52mBsnsbgt+DnHKl6lWIS4ANLYdW82+5e1bxoL7sNNg8/Qxyx6hJSpvY5IYJGbEFcWwvq0cCXrvfRizial6ApBQNzYv64Y2n7MQih9okojZbwrWjD1w/nCGq7LwMDB/JrtKLlSPOcSXvh821bbw9Qra3VjgU10GfrFbdKniG7UWIq8DoB9V8VbKt8+kkkYCUqUlct0azKPcJYtBQMWOlxzuSipnWSs73xosI7paAa0T1rSo5BJQs8hRnnDxptao65SZNC2528CG2ahIPJ2TGm39YK7rdKJUmkkIQqE3xAWvMIWhAiPVkWxCTycZJqjdb0RQEt37DchnJEqGvJKjD7lG3+BLhX44EoukuHaeqgkyaxB1DRfDlCSuYYaogdR3ZFvMxPE8Jw9jPB9uiFU1kDCjDERJzMtDnUiEp9vDMC2AYMrQf2IlHj9Er03afRPSnzNBhYnPyjQo5kzZoLjRGqIx33FPfTRnYsQ8LplYZlrMpeDWJQpH9eQj7ULOPMkw8MyoHXRPHEjFHR0DEysBkBXhEDy6tdJoMYY7Rghpd87y7X3F6DcTnJY3i0WznNsm/PQV2s8X7MXtcOOXjVrl6MdsLt+yQRuZLUpAkVWXyepq2fdhnGIwUCroNm3ZzXV35ceg1rgIry7UaFdFQzKpFscNurTdY/kEIYdYZhriw9imEY+nzPTNbl/un3G6pHbCYZrOrsaXyryzm3GFLm32WD4We7zrq7Fv0uYpuq629M08ol2pVgyXldt6JV/o1mMYtKsw3O4OpQr19sCgLNfSC2lQIApTWKHQypTboIW40ZYLeFye/lDjUkX9Fn9/aLTIBtTd1PMVp+STo1FOMsVjQi1cfhPaqswIqM5C+SOsUKn3DIsLDDvHCkIazyMkmu8bhny9pnEbvCleSJp9oRw1lORylXq/ySr77I6m6azm8UgknMB8dhVmd4fTM9miqJcqmUJBlDCTLOZmSi4pHLa4AOWiju6LswFLgJV4BriJXzj5ipXIlXwiAuamk5s3suJuD/SHGUOMpUMhplKdCcDIvIbKThH6lHVP+ZsrROPbwSskW7GJoafFRCgMlR/IMeRndh+q+rBh2+BFhqRoxMhl1/EWym6oRPIaObmU0TkOuQ7uawc4cSU9LaPlhHD5GO9IbQxvnGmWgTNPOslB4XI8xn1XkYtZBF87V34n30sinyNRPyRXe4JU0YeNlWaL/9y+lu6G9qYTczl/Luqf6cidgPSK0WyjLC5tHY6mIz7a5LbaoplkatuhPZPmYq+vNdrcdCSVERv9xdHWySHiyOEoPY2m9MozxDFcTvFULBbkD42W0D2fFd2zf9POnav7m2IW7W8EzxT6g4IsVwf8/sFgP49ihFMi1enYBHhGtlq16CIPrax8EyC1Qpm8xH2bxeWIL8lnpk56M6f9kS6qNEazzTFN+QJhJsVn8kRFjLBJ7uqnPIRwrLsQFyX5YRIihexVNspBwWwWUg6OBc7hkjNcDoav8kLv9Mch4VvfQG7wOJ16H11081IWPFtaNxR7SvAg8kO3ZJf7SCv4Qi2JoMdTvkiBDlau8YYhu0ZB7P9I16LFdb4GYoKzio9yYSncjzEolrN2CjCl2RTU5uoUzWOhAhG0de703Srj85W/OeRL+zy7/yvTdqRTx2MGZDwcJ5OQaw9Wrd7gz1aeKI4RmqcszKOwgAO+OaCNk4QD7RstNTA+9akF+zkUIDhDIaYyDEr8nnoCvTmjfabF10gi87MPnC4N6DxPwGmh48JryRL5bJsbtBarCnTLYsghn1xio7EDXbUZ3jF2nFqfbLWt/XK15m7G4ojcq3Y308v9cr3CMdZpQcNTKKHpsYyRzRKMrFah3LHhzVpMMH6iXYBHJ8at7iy3jihjQQTSYPOIuVhYJE79KKu9UEos2lWSx6yrJB/jSBVzrQcliNjYdnQ5FUAzjWIiTJW5fcYN1NLsSCMyXNGsK83aGpE7aLR0MYTiEbu18trd5GoLJD3tbDHXNplmLdZkMhkKIyGLJ1lMw/MYhHbIBaApIw1vy7XKF/kc8QM5ilQxVaTJRxUsA8q6OG0o1zq58F4Pk21N2LAFwqyqyYtVwa8Kv+nJGTCiOapE62A5X5zkOihrkWzgGo/nabD5apZj50ACKRcXY8K9LHclqnMBcksrX2XgvKdephQqws29bYGZuBsCpOGXa6K1o2XLMpJ0DUtzdBRRqgghrQUiRsjX9n1uvDgpErWCQDRKyxV3lTXElP9YKFswaZzCjATmWsgOUyJIqUsS0iaq7o2ka8dko2xOX+qT11HpnCqtZYsi7Tx5djUv21IZnm6VagVdZLpBGEP6Zge59bqZtN3Te6bgngyp+lOvctAjRG4kBTHHCUhz3hjKG0CQQoczV2+jhCJgorr1Mq5FMs2LAIPwJLniwl46mvahpIgADgihNGnhtmOp3YczbOizKg5lYsFSqvhKkyaS1NantbpmK9zfaDwvPSmQCIRIxCmh24tuA3LNgUhHRLf008EWRNKBSRYUU8rilaEFY036Ziot5BUJOXK1vQBbxztoFyOvDiNdzUl4RiWYyLnzlOtn8qEb7TQ8M9XHXBDhpHQu4c7ZECEdkc7LQVGJYWhc9I1/olHUqBHlnRiiGszaa7m9hlfbhYV0NFv22aevVy+WKL+s9i/eAnu9TwR9ua/8+eqqPjz7KIHGjyrosmxtyezCD5iqWVUkL+wS1oMxYX35kr0+3hS7MnlKp116Bju9W+5Q405luiK5Qr6+d2UtXpwR5YdH+0ity+mRMlQ/iuvkDDxCQVg0csn0EpLNtD1gHKV2sIfcKXg17xp5JqK1h9WpnUr91mjJUjig+quVuKXNaJW0uSMIWO4yqT0lYKURtYzrKvGWmgyTFhkDvXuZqQIYNrIB4tDEPUfCW0BrAHxEMpFHH+LMloaFxy1eVRBWm9vUSMO5Y4RaiXZjqSlqAD7dueqkz/pmHMrKBcINprUxNAijA8ee5WjnQClOubm1XCHHRuHZ65dSUiALoGiUSVd43eR2TkbAs3RRyqclKbCpsqt4KtINVfZMylrIb3HvkpvyMudTaUmJbCFWJZYdto0vLa/MBir+SchW4ilhSNr8kfN6sihzX6vBJvINm8ixjWDxzNoq3ZR8rsRV5Qs02ZU5raw1Rb6FyJGm2h0S5D3/sv++/yH+InKjuIvWeZA1EpvP/McNRWmEFyhOTdBBoa8y8ZgexeG6r5yzstjFJuV+NNi1TeMSlR6KZMaitERxCTxx8VWSzJqrGUkrAx4F0qkYTHaaXi7csM4JX5sqmVkQRP0MGGcYMwmrM9QTBbP8Pk2ZsxxTKIWuyjJYg0AHNP/9zLerbu57J3SBlu7obqtKrFSeTiPXz3P/zEXnIYxaD5QDD8ejWDwOOhP3c/FVOmcZLH1IyyVUoTdTkyS0t+uQAUnWMQ+z29IN4rnoqE0emzZZVFfTowl2fhtChckD+XVgV5cqw0rh7elrtW234ZntdjLz2qwcZYapfQYmuwM3Yta8KpJN+WoBm3rtfYlRgGSh+wuVPWQJoZdIua5n0rH1hoWeVnqJKQ0vIrs5X6g084MjcJ5obXZ2CpHfa0wTMcfe0HmZygyfSMmydM/Ug2DEbdpzBlkCElFyUkOUsPfG2DnROfRN9ev5prHBKev3ZI1HEznlDDFhhwK6ACkLjWHAh+tUraux6PEl9DVhkDG8XP2SOlLOzuBxha6u3qVPnEKPKxMOJq6lhFmpDmnHJrrqmXPaG9R2IfIRDxE1Y8ZGiEVLWbgsj5TRxROtS1upsgLXTDJmm1YlI8coqz1OnXFCsrtWWdpmPnucauWEZEsWmKyMQcubZzo0XKylFclWlAhdDjHZQdo/J1xFsbIFm7XmUl6Kecb8ruVrrYyqwPaYpxGwDE7E+1gq37VJEDiKlPoa+LDlMxtxxU55xG1K3Q0XiMhC1EkDTcnvvQ/AdaOLoZZAG41KPJtQmGrmBZNHwtgVu9hlCOkCcfzVr8qe4qC1iCqxRsdOxZV9WrMfITVq68gosor4Dq5si4L2OcaOQ583Z/LcA9Qr0Lw+w0Mh635HyaWRtr8hK/CRHPpZ3b/b/rXPqSRsETSWuFU5rEcu7d4+iGdxtITFo8jj7TGYrfoNc384CML8FnfWd3MPZ2tB1+8IVeZHyh5E3DI1NDj0rum2N3SlQ2atufdT8AWuxCLGT8ZYd7F9n7aaULA5yrpvxa8ZiGW4Lz6zfVnyZFPhFdUoJn0BBJAXAYA3dzCzP0PP6IoUujbtyZHVfWf7LvXUyEI8uSpxlyvcJpL2XM62zCdYgiM1BWjiKDe1xBwkJEKFFqhy4oZAVticM2ors47n5M4lynu31tGZLYLcDiRA2DwQ53xslI55+rzKF4g9xzfrCFnX64zfPcP5S4b5AaZnanD+DcYy6VZmS7QfWOfDoloLmetXiHXD2xux4N4Dz+C/cPkLXRiW0t/5TJj5PtdoWx7OM2+5Xc77lpQjtDO/vlout8qTxOEnSfK1UqZ/8Yq+HZ7ZRg3LP5zhWXlbT5Slt0wdptWW7y8oDadZaa0kEf1iGEJqHfRCUaMPfDfUEcpAMriytXnBN2u0ztm3OFcui/Wye8uSluGmtIuOEI5lG9/WWIbSaz/yeam8v8J5TZvHVfSh1Na71vpt1VkmJrAziLuZrldZtp9n+8yMC4uqzlM2TBNAzyuqcJpV6ANku4FO44/LMgz6iZaC1A7FgB5NuOlX1j5P3CKnqWXFrq1rng7MDuHT4qYBDRcxUyVbHC1y7MQ5JgtuIbJyFwxS7hri5YDX6B02KnqdPdKBJUcdcSmgFuqO2ps3Af67H4GXTykHqc5sQXhCIk2PD9QsEuLMWVKQZtBCm2TBB6ZpXl5BkiRK6s9jC6hcmxxJwkSD1xq4iZcrrqA4xjNlFeUVbEtIp3655vuLjdPavZW0NRoLHaH3jRrNIsr+YPOxphWGOtUtX69sMs/J2TwXMQ5PRK1EjDQUBcrD7aV1dm0Lvuvn1O9Z7R/M8+/7fv7/s0iVlgf6tBp7l6efefavvozfP1undI1FPkvqbtOM4MjgOThy4Kszvj/+uv835ocNdLPATN3gu0DJmdOBwiYvZ23H/9T/w3lmb7tq2T+7yWfNmgsubH0cBGsZ61V7JkbWrJgoaTGyCL3ld9WnixdUU4jazbaIuP7nH7aYnLJCmnLTOc6pbU9i/ufZ8oVOgWKCTeNwGpevr9+v6mRm+J3BcZ4D32IHfX5/yJqh6c8KsPwEMsMTTv7gHzz6kx7Pxj+HDp/QgMoNX1/nFv0B/T2xLdKk9KGr1/jnVh+1S4AZ57ogCeVLn8vpn2vs13f26pMtZc8G9TRf4na8B/XN+nax9pe9+httqLlwXfQ0FvDcq54YgFT3p9WZLcdGR4v2qUS2nIPv2RsAgUKlxemvJyTxCniK1/00zagWEgErExwPd0GLWX8r8/8VafKXk58Yu+V0ZFna+3R06O+/I+0+L+y/fD241LpbiW08FYnzCLXSTEaa3lorVJSZfYGL2WHacQM+F5IwACdeA2Y13uH32b+ZtOrlb3Ey1KDla2/0EPRTu4YfsarxL0U22FVRwF8+WncrtT3/d3e3L18eXm9urnf7/WUOZ8tshMubQ/rJm3z0GdLf3Gzgklxe9d7f3e6uopq6Dkf98bbt8Kcrxj5S+tr1ZZW7pqSnYXZ4sZ/1OK6fGPtOlXsdQvooaA1P9F/uMDX2mLas9Wjy97yU690/QDIS/CVYopNRFlvRpajfX6fYeMuO0CdlxmGuZCXeUxYRgABg/B+cSxG+u/WdlH8RHgQs5r5y8eMaOPZbB/349f9VqzMbei861TcAFGCcASyNKxuwoaBlzmqIpLAjDqkXJ5gita9nY6mLml8ixUjUxPIaRZVuSu3FteoN0KynSou8c1ypB5Puu6A8erXiDy+UGmUNpZlpIRXRClriydN0Yd5jnkg6LdV6/w+I/fCGhOUpB5LCmZ6YcxinqkJJc9JnFnqMjyB3XXumoCaFxaFVrmRPKjDL7WPKWfToVI8gx+jWBDCa4HAyjp8CZEXq7Vi5M3qjpUAQy/s23sSMakejSWwxjh42k9Y39QcEy4R3ktg8GetW72TtClmYowPioUbytC23GCbtiFG0IUTEn94mCqgGSBngSw7EILLwJlwGG/LXhEsqWsAy1TF7lHzaM/WehIJJp0xYNnT+gkSZoHOhBRD7CMH0RCxlaeUB0bMOr6kvBdgylZWyr9oJoF5XBQdStZ5X7aTMdN5MfOxPEshvCvGh6LuWKO2gqIAa49yS+mwTknIICXIhriY2+dASBhUwvsKZKmzym6I0+ArmaYVOT+5ehFaAyKF+qWg7WMQ6AwctYRyA0jpSM5Tl+iAB8MgIQavQepChKzmgl2mUrT7oGrSVEYLmoS5ZAizJQUea4MmdP5cYYVvwEvqRfCERdltScWmxWgX0CpYAzUpqBNtAKvFzi8O+12yugYsW9V3JOHDhh/M2WAjaCtJynTSapfE9lAc7EBTL1E/tCRbJCMG6YB8ugm6gdT8qCLYH6wEAeOwPFuT6E3gfNrVwIRWtB+2D/jy1UY6eWHUxsi5fsWAPDO8JPWqzUmvFO78Et2w45aPo4FHK+9J+bZrq49XMm8TtHq6W/pgD3Vw6v+aTfafn+aIVu5EAcIsKtRMgyHctUYB+V1ctCgxyNJfpYjsKqHO1DqKNfpxpZ2llIrMnxJtJgF5yVH2sc5L2xMEaK6aIbaJh4q60UritRG5DOmpnrqVvU7BmAcVs9Vg2wne25yleFbNBQO0XO5tr7M0q6rSw3CfxiGOui8eg1nqJENReTBkgMdQLnEG724YDgjWQmsvgmA+nZpSMQF62x7MHzpghBPQIdRUGrDG36oJwBE1JBtYFAGoblCezdizLSn9pzpTtDkL46c+cGOlSXY2G7Eu9wxh0E1vsn+t6QTCcWMtBcRFUGrEBSjf7GwQzL0oJFtPb7dESk4h1WSxBwFjwU9pvcsEylrs/6rPZNsiqNjXYJRykdVOj2rMk9APkEPPQ61KMJH1s964ahWDxweFwAdmU2GeX44wLeVukIG2TNYArl/WHhbxvzQK/7kLSsRTh8MF2xPKkWsKfEihsqkbqNngKbS+2D6tuh+b0PBmoM/bU00KGQU1ItwFhtfX709PLjF5zyVsk2IqPj2Z36BX6aueDoOE0r1yoDgd7yNSGIzmQ2M+P0yHMDkwhgZl7RVuJiZI+daLNYIJdQ20cHNcVQExM6B/zB4goj1JUTBOp5BKRAFjyvumd1E0r9GXOaDSx3s435mGlr3ZQ7lRrgJdG+OoBhoZgHeIWQYyTebVhfu2dfW6lfmFD8PpMZcScIvTVSnd20Qasx2zkqb/2xslYsGJjVIWjA3R2hkVHTQ2AMnSwGeGwWeaeFHJMHgQ0AM7qzp1v5d3qn1zgLRLIgz79QrRE+PQItKmr7HHPyxJAKwG/uKGgNpfBYrVhptpc1LlyxXKM5dG6MO7AEu0VnFEb43PObs6/PR4xd3RsqTM48wqdj5BoEM6ox3Er1fkl8S1sxgayQY6sBTUCamO0kuqsyW0cXU69/2YSWeAw7BCMVMhSy8ztuuwqJ2Qul8yBv0wlYk7JaMa+WOUh1jhVCDcmTeD4CfgjuGcWsSUnsWThTO0OE49zJsCbhxD/rO0LgD7FMg2WjxgurlsqHIIROavXq0Tgl8FJM1ISLoA0LkjVARTM1oIZM12qwt5LohIsdbDUJyWpPEnqQiqKuXoALXh8OoLzKAH6F/QQ6Hdgcb5PuErSQF+BvnfSqm6TsmPYLm/wNQHaq2KAx7Y6xaHw3Mj8YBnRZUeWStYfp1y4QLCEEES8SqOiLU7sFqlfkHWI5UY7ZlrlCcGQj0pUFnNfhE8STbZbMWHmiGamkS1VoMoFv5A7ExhRYBqxeXbI3cKQvpAd0h7OA9iODgLWuoB1JTbV3HU6R7U+nrUjsEnIErEJibpZGiuJFb0pn+M+z+14J2QfwSWQZ4sGGuGunb4SZ3P/CeGI0CkgvjaEv2itBUVKkm7iDF4P57WBoDxqt5MuEIDo5DNmsRAGoMBDQhFgGNwDAwSAzeBEoBn3OO5xP9CAQAiGBhS4sK0BgzisQ/HUBgbMpr+BCUE8bGBBu7EbCAi17xveggS71cCBIuf63kY0NnBB5ZcbeHjGnLFmwItjtrUXbBbcR/xS4jmQG8/DavqYZIFHvX/Wb1br4TrzTkpuOQbq22UxM3kKmU/EernILh9N1nsVGpqFKB2bvu2xfiAlxzEYoma9vPR69bv2fbuEkNGbpudCe39jywc9zJLAnKkmPBBEc3VpJBdY+vp41OpPBiBAREn2fYb2iGqmQiBVHU8ityaeVRwB2cmTvQMlx0cihKX02cPnG+RBKcjOSHZomM9d0Z/lZHnJtzSFAvhGWwQeL+MyXx7CR6Np0ALESDu0BfXG4xALsoCVYQjUI6NxwaL+pAAOcnLRjN9mYTOiFf90Sm3B3cdauQO1zxZjxcHukFYWmCNfF3zltJIxCouvo/Xogc6xKRgKKGBzBOwPBHgAG6ZK4+Nev3EeM/DEC3J6c7MjwA9/AggkiGBCEPIuIkKZy3uIDYNw5iEx49+PoogmhljiiCeBRJJIJoVU0kjnfT5ASgYyPiST+VBkIScbBTkoySWPfGgKULGAQhai5h9oWEQRxZTwEaWU8S2H2Ewdp2nmIVv4HAtfcph2w+EzY8AmdvECXkIjX7CVC/zOc2ijk//CKxiHg3xHD1f4Hi0fswMdLj7hKteMibAQAvGAR+gZpJ8BfmAxY9DELW5wEwNP+ItbgFT+fgFKSn1cKigkWAn/M+RJ+NOIb55FRUbHxnQrg3weJ96JMz1tjHVcrzGVS6HSmgaRwfTZZ3O4PL5AKBJLpL32v0CuUKrUGq3O0sraxtaO1He7GIeOHDtx6sy5C5euXLsBAPtqtwwwBAqDI5AoNAaLwxNq0ZpIIlOoNDqDyeqvSffsV8Th8vgCoUgskcrkCqVKrdHq9IZ6G01mSwcOq6y6rZ29g6OTs0uf7VizbsOmbau+VOvm7uHp5e3j6+dvJAAQBIZAYXAEEoXGYHF4AnGCcF+Mzvh/3fP4AqFILJHK5AqlSq1xTHRydnF1c/fw9CIQSWQKlUZnMFlsDpfHFwhFYolUJlcoVWqNVgeoNxhNZovVZnc4XW6PP0SYUMaFVNozvp12giBKsqJqumFatuNWqrV6o9lqd7q9/mA4Gk+ms/liuVpvtjtt2reu4HUZ848OncZJMEKyBu/8e2vA4L6+A7/Og4ePHj/x0pvDZ89fvIRVq1CBc6qgFamRJUeut2ev3wAgBCMohhMkRTMsxwuiJCuqphumZTuu5wdhFCdplhdlVTdt1w/jNC/rdrc/HE/ny/W2WK7Wm+1ufwBACEZQDCdIimZYjhdESVZUTTdMy3Zczw/CKE7SLC/Kqm6Op/Plers/ni8CkUSmUGl0BpPF5nB5fIFQJJZIZXKFUqXWaHWAeoPRZLZYbXaH0+X2+COxqHlk9Zv/mBc5ImIS8qQUyChSokyFKjXqiqrphmnZjuv5QRjFSZrlRVnVTdstV0Zcb7Y72R8cHh2fnJ6dX1xeXd8AIAQjKIYTJEUzLMcLoiQrqqYbpmU7rucHYRQnaZYXZVU3bdcP4zQv63a3PxxP58v1dvwJo06cfGAs48ypA6ZNZLDrvPMn7zebhb++6OJLfiPs5+3ju3bZ5VeYsK66+pprr5tsX7xxa9K0CSyWg2AhP1YCWT09ndY7d6j8oXT0gM3yFr7K/bwPSrZVyu3X4E96lP/TacPTj7uAVNkf4A7JSv747wYSEfKb6D/m7BkierBaWk16kTTcjdgd5YjFoa3RjgxrhF/quMfyfg55Zqn1WJOVDt/MoNlDhvrmsG7V8OfkKdBjbFWcQpZacGKHHo7a0wl9NJs4UbbIp7+REX/XUWZHR+2Z4qP5lvND5oi/dJnAVW0qYojiWGSDCvDSZUVggvMQyXCMwTlz4KHLl+DcMCMIwsMfDURnw9P5qO42js5guD+KO7oo/l89qgnGjQ5xONT3Esfpw8HNEPkw3I1imczQY0rDspJWJKeQ5/a7ejcZZ8lvxjILD7II+aWgrMlWcQb10GV8687u+J+ta2VbnQr2WHJhUykrhkuYHqts2LGtLudJW6nXHCnXcHejuvnGOWw6hMMFNdVZ4AbwFjSmugvgXXZNpRVYUKNmhZ+kk5fhK3TyduLT471mfEfmbpjtL04a9vExXozPiX/9AjpWI//gn0d0u81sK0sZMhS04GMqw2IR4qwvCq53YNAx+6mNd4FG+xPZ3maV8GHqyfaB9zV1cLjkAhWAH/+QsxnVi9RRbt4oTSPKiufcXZUumwEd7Ut3F5xQ10kPXHtNeS/tR/dPVEgFap5o9Qhlf1OI0DgKxqiLUwkSCFIIroLY/AZBLsKSD1CJopOwRhsxK4c5b6jdLPP3/FvGJ2/UqQ7qXd+UjxGTvzjCl5heEkv3tFg8bu+xerZA9CAWYYKYC6I39DWU3G4kOujPE4Oc8BtuBRKCtyBV6+3QnDna5TPYeo2zYCaDs+kuqO/EGrfg966ne4lVEytwqdQfjf6qSpFnAOJAQxHhunyb6OUdBiPL9NJRZNkwgCk1UbS1D8kgRCm1hQhlwwIIYZxyGzwshTHGmBBCCCGEkKVlMsbY0QERJpRxkWUjACJMKONiiFJKKaWUP042gPYxDECECWVcDBHecG8oXAOut8svkDt8Hc4uoyd+HfTlY+CgX26HtzfUx/kcIh38HG3GN5DplrSRxq3bUU8xqc8oxbl+uri3nUSvJq107UUtZynKXfMrBd/+0Euvgx1Wx2j88Uy65IHpyCdY6dPufza0ktnefoYl75+/uC0udqGwg8P7Biqu4WNz7f/76dm//vINf+a/QbyTjPm6Imrdic+wvv2ykNpEJkMffafnD/kg490HzZ+Z5rl+2kfhhPJwzVpxXjmOnf2Mp2m/+REpemAMMy0V/j/Efy4iTCjjQjrdnXZ250cVdD0BLmzp1siNqLMdDk9sAvT4XqH90vInMr3S++//86kVxe5XXjP++9+vV3XTNx0cC67EBwfv/PLR8/f3791h90MPj2dJXv3o0jBt7AgQYUIZF9JxlTax6QARJpRxIR1XaRObARBhQpmQjqu0ic0kTCjjQjqu0iY2D0CECWVcSMdV2sTmBYgwoYwL6bhKm81+eRV8Kj2GChFhQhkX0nGVHubL33L4NABEmFDGhXRcpU1sDkCECWVcSMdV2sTmAkSYUMaFdFylTb+jAkCECWVcSMdV2sQmAkQXHhOfAwARJpRxIR1XaRObFyDChDIupOMqbWKzACJMKBv8S4Xl1lBlbP+c+CillNZaa62r5dBaa621NsYYY0wND2OMMcYY2+zRJ5RxQZjYVonx8C0M23ytZ9I5+Jj+/5dNngMIjdFHWQDO7JYfSCmMHLODyku0021ljikS5YhctooCAXFBDv5lZxdIpzfYNzl3qFJ/7OzXdUcO7078M8hqLbSViaQ0DfgdnDyTqXVgGz60FuxiMtx3Wu7iiX1n0b2FFAS2kJP9rxai6tSePe8yHV9Lt7xz9659Bw9u151MCdUTjuWACXd9WT+hXLWO5IWUBYLbtSlWTuBlO5GmQ2VnO09MdboYJ6VVGUNGZmcBIyPsv/nV0EjlZ6yRe4uq9Bbmk6ECEUrxyvLvQSE4VaHWKGzQ2uidm532zrbc3tAMoQQDsneD9f9IVcH0aPHWmzN7rXFW3qKoEVRR8egrBD0bWkHXHPRF98fub130RQeRWxZvO/6bdlqIX6aVjfy04uDtCongCsHjyhscvDiC47/ii2umEKAgPFCOgCtgjfw1AiBXjyBq5BP6NFNJLNv7RPv/IrWOzY/XkbsoLHhqvi+M1jX0y4MyGq88R5DH+v2oEWqe3jpXsLIOBcNEd51KCJ47oDY8cYJlt5w4eZL9xjZ5AixIRZgeuLYA\")\nfont_name = \"Open Sans\"\nstyle_name = \"SemiBold\"\nfont_weight = 600\ncache/0/16/0/ascent = 18.0\ncache/0/16/0/descent = 5.0\ncache/0/16/0/underline_position = 1.60938\ncache/0/16/0/underline_thickness = 0.796875\ncache/0/16/0/scale = 1.0\ncache/0/16/0/textures/0/offsets = PackedInt32Array(16, 0, 240, 4, 252, 4, 4, 16, 253, 20, 3, 13, 256, 33, 0, 16, 256, 49, 0, 17, 255, 66, 1, 18, 254, 84, 2, 20, 24, 104, 232, 6, 246, 110, 10, 13, 251, 123, 5, 16, 256, 139, 0, 16, 252, 155, 4, 17, 66, 172, 190, 17)\ncache/0/16/0/textures/0/image = SubResource(\"Image_bboio\")\ncache/0/16/0/glyphs/3/advance = Vector2(4.15625, 16.0938)\ncache/0/16/0/glyphs/3/offset = Vector2(-1, -1)\ncache/0/16/0/glyphs/3/size = Vector2(2, 2)\ncache/0/16/0/glyphs/3/uv_rect = Rect2(1, 1, 2, 2)\ncache/0/16/0/glyphs/3/texture_idx = 0\ncache/0/16/0/glyphs/48/advance = Vector2(14.7656, 16.0938)\ncache/0/16/0/glyphs/48/offset = Vector2(0, -13)\ncache/0/16/0/glyphs/48/size = Vector2(15, 14)\ncache/0/16/0/glyphs/48/uv_rect = Rect2(1, 5, 15, 14)\ncache/0/16/0/glyphs/48/texture_idx = 0\ncache/0/16/0/glyphs/19/advance = Vector2(9.14063, 16.0938)\ncache/0/16/0/glyphs/19/offset = Vector2(-1, -13)\ncache/0/16/0/glyphs/19/size = Vector2(11, 14)\ncache/0/16/0/glyphs/19/uv_rect = Rect2(18, 5, 11, 14)\ncache/0/16/0/glyphs/19/texture_idx = 0\ncache/0/16/0/glyphs/43/advance = Vector2(12.0156, 16.0938)\ncache/0/16/0/glyphs/43/offset = Vector2(0, -13)\ncache/0/16/0/glyphs/43/size = Vector2(12, 14)\ncache/0/16/0/glyphs/43/uv_rect = Rect2(31, 5, 12, 14)\ncache/0/16/0/glyphs/43/texture_idx = 0\ncache/0/16/0/glyphs/72/advance = Vector2(9.21875, 16.0938)\ncache/0/16/0/glyphs/72/offset = Vector2(-1, -10)\ncache/0/16/0/glyphs/72/size = Vector2(11, 11)\ncache/0/16/0/glyphs/72/uv_rect = Rect2(45, 5, 11, 11)\ncache/0/16/0/glyphs/72/texture_idx = 0\ncache/0/16/0/glyphs/91/advance = Vector2(8.8125, 16.0938)\ncache/0/16/0/glyphs/91/offset = Vector2(-1, -10)\ncache/0/16/0/glyphs/91/size = Vector2(11, 11)\ncache/0/16/0/glyphs/91/uv_rect = Rect2(58, 5, 11, 11)\ncache/0/16/0/glyphs/91/texture_idx = 0\ncache/0/16/0/glyphs/70/advance = Vector2(7.92188, 16.0938)\ncache/0/16/0/glyphs/70/offset = Vector2(-1, -10)\ncache/0/16/0/glyphs/70/size = Vector2(10, 11)\ncache/0/16/0/glyphs/70/uv_rect = Rect2(71, 5, 10, 11)\ncache/0/16/0/glyphs/70/texture_idx = 0\ncache/0/16/0/glyphs/82/advance = Vector2(9.78125, 16.0938)\ncache/0/16/0/glyphs/82/offset = Vector2(-1, -10)\ncache/0/16/0/glyphs/82/size = Vector2(11, 11)\ncache/0/16/0/glyphs/82/uv_rect = Rect2(83, 5, 11, 11)\ncache/0/16/0/glyphs/82/texture_idx = 0\ncache/0/16/0/glyphs/71/advance = Vector2(9.96875, 16.0938)\ncache/0/16/0/glyphs/71/offset = Vector2(-1, -13)\ncache/0/16/0/glyphs/71/size = Vector2(11, 14)\ncache/0/16/0/glyphs/71/uv_rect = Rect2(96, 5, 11, 14)\ncache/0/16/0/glyphs/71/texture_idx = 0\ncache/0/16/0/glyphs/85/advance = Vector2(6.90625, 16.0938)\ncache/0/16/0/glyphs/85/offset = Vector2(0, -10)\ncache/0/16/0/glyphs/85/size = Vector2(8, 11)\ncache/0/16/0/glyphs/85/uv_rect = Rect2(109, 5, 8, 11)\ncache/0/16/0/glyphs/85/texture_idx = 0\ncache/0/16/0/glyphs/81/advance = Vector2(10.1563, 16.0938)\ncache/0/16/0/glyphs/81/offset = Vector2(0, -10)\ncache/0/16/0/glyphs/81/size = Vector2(10, 11)\ncache/0/16/0/glyphs/81/uv_rect = Rect2(119, 5, 10, 11)\ncache/0/16/0/glyphs/81/texture_idx = 0\ncache/0/16/0/glyphs/68/advance = Vector2(9.28125, 16.0938)\ncache/0/16/0/glyphs/68/offset = Vector2(-1, -10)\ncache/0/16/0/glyphs/68/size = Vector2(11, 11)\ncache/0/16/0/glyphs/68/uv_rect = Rect2(131, 5, 11, 11)\ncache/0/16/0/glyphs/68/texture_idx = 0\ncache/0/16/0/glyphs/80/advance = Vector2(15.2969, 16.0938)\ncache/0/16/0/glyphs/80/offset = Vector2(0, -10)\ncache/0/16/0/glyphs/80/size = Vector2(16, 11)\ncache/0/16/0/glyphs/80/uv_rect = Rect2(144, 5, 16, 11)\ncache/0/16/0/glyphs/80/texture_idx = 0\ncache/0/16/0/glyphs/79/advance = Vector2(4.46875, 16.0938)\ncache/0/16/0/glyphs/79/offset = Vector2(0, -13)\ncache/0/16/0/glyphs/79/size = Vector2(5, 14)\ncache/0/16/0/glyphs/79/uv_rect = Rect2(162, 5, 5, 14)\ncache/0/16/0/glyphs/79/texture_idx = 0\ncache/0/16/0/glyphs/50/advance = Vector2(12.5938, 16.0938)\ncache/0/16/0/glyphs/50/offset = Vector2(-1, -13)\ncache/0/16/0/glyphs/50/size = Vector2(14, 14)\ncache/0/16/0/glyphs/50/uv_rect = Rect2(169, 5, 14, 14)\ncache/0/16/0/glyphs/50/texture_idx = 0\ncache/0/16/0/glyphs/46/advance = Vector2(10.2344, 16.0938)\ncache/0/16/0/glyphs/46/offset = Vector2(0, -13)\ncache/0/16/0/glyphs/46/size = Vector2(12, 14)\ncache/0/16/0/glyphs/46/uv_rect = Rect2(185, 5, 12, 14)\ncache/0/16/0/glyphs/46/texture_idx = 0\ncache/0/16/0/glyphs/41/advance = Vector2(8.51563, 16.0938)\ncache/0/16/0/glyphs/41/offset = Vector2(0, -13)\ncache/0/16/0/glyphs/41/size = Vector2(9, 14)\ncache/0/16/0/glyphs/41/uv_rect = Rect2(199, 5, 9, 14)\ncache/0/16/0/glyphs/41/texture_idx = 0\ncache/0/16/0/glyphs/76/advance = Vector2(4.46875, 16.0938)\ncache/0/16/0/glyphs/76/offset = Vector2(0, -13)\ncache/0/16/0/glyphs/76/size = Vector2(5, 14)\ncache/0/16/0/glyphs/76/uv_rect = Rect2(210, 5, 5, 14)\ncache/0/16/0/glyphs/76/texture_idx = 0\ncache/0/16/0/glyphs/87/advance = Vector2(6.29688, 16.0938)\ncache/0/16/0/glyphs/87/offset = Vector2(-1, -12)\ncache/0/16/0/glyphs/87/size = Vector2(8, 13)\ncache/0/16/0/glyphs/87/uv_rect = Rect2(217, 5, 8, 13)\ncache/0/16/0/glyphs/87/texture_idx = 0\ncache/0/16/0/glyphs/38/advance = Vector2(10.1406, 16.0938)\ncache/0/16/0/glyphs/38/offset = Vector2(-1, -13)\ncache/0/16/0/glyphs/38/size = Vector2(12, 14)\ncache/0/16/0/glyphs/38/uv_rect = Rect2(227, 5, 12, 14)\ncache/0/16/0/glyphs/38/texture_idx = 0\ncache/0/16/0/glyphs/86/advance = Vector2(7.79688, 16.0938)\ncache/0/16/0/glyphs/86/offset = Vector2(-1, -10)\ncache/0/16/0/glyphs/86/size = Vector2(10, 11)\ncache/0/16/0/glyphs/86/uv_rect = Rect2(241, 5, 10, 11)\ncache/0/16/0/glyphs/86/texture_idx = 0\ncache/0/16/0/glyphs/29/advance = Vector2(4.40625, 16.0938)\ncache/0/16/0/glyphs/29/offset = Vector2(0, -10)\ncache/0/16/0/glyphs/29/size = Vector2(5, 11)\ncache/0/16/0/glyphs/29/uv_rect = Rect2(1, 21, 5, 11)\ncache/0/16/0/glyphs/29/texture_idx = 0\ncache/0/16/0/glyphs/18/advance = Vector2(6.25, 16.0938)\ncache/0/16/0/glyphs/18/offset = Vector2(-1, -13)\ncache/0/16/0/glyphs/18/size = Vector2(9, 14)\ncache/0/16/0/glyphs/18/uv_rect = Rect2(1, 34, 9, 14)\ncache/0/16/0/glyphs/18/texture_idx = 0\ncache/0/16/0/glyphs/39/advance = Vector2(11.75, 16.0938)\ncache/0/16/0/glyphs/39/offset = Vector2(0, -13)\ncache/0/16/0/glyphs/39/size = Vector2(12, 14)\ncache/0/16/0/glyphs/39/uv_rect = Rect2(12, 34, 12, 14)\ncache/0/16/0/glyphs/39/texture_idx = 0\ncache/0/16/0/glyphs/78/advance = Vector2(9.15625, 16.0938)\ncache/0/16/0/glyphs/78/offset = Vector2(0, -13)\ncache/0/16/0/glyphs/78/size = Vector2(11, 14)\ncache/0/16/0/glyphs/78/uv_rect = Rect2(26, 34, 11, 14)\ncache/0/16/0/glyphs/78/texture_idx = 0\ncache/0/16/0/glyphs/51/advance = Vector2(9.84375, 16.0938)\ncache/0/16/0/glyphs/51/offset = Vector2(0, -13)\ncache/0/16/0/glyphs/51/size = Vector2(11, 14)\ncache/0/16/0/glyphs/51/uv_rect = Rect2(39, 34, 11, 14)\ncache/0/16/0/glyphs/51/texture_idx = 0\ncache/0/16/0/glyphs/74/advance = Vector2(8.90625, 16.0938)\ncache/0/16/0/glyphs/74/offset = Vector2(-1, -10)\ncache/0/16/0/glyphs/74/size = Vector2(11, 15)\ncache/0/16/0/glyphs/74/uv_rect = Rect2(1, 50, 11, 15)\ncache/0/16/0/glyphs/74/texture_idx = 0\ncache/0/16/0/glyphs/88/advance = Vector2(10.1563, 16.0938)\ncache/0/16/0/glyphs/88/offset = Vector2(0, -10)\ncache/0/16/0/glyphs/88/size = Vector2(10, 11)\ncache/0/16/0/glyphs/88/uv_rect = Rect2(8, 21, 10, 11)\ncache/0/16/0/glyphs/88/texture_idx = 0\ncache/0/16/0/glyphs/89/advance = Vector2(8.5625, 16.0938)\ncache/0/16/0/glyphs/89/offset = Vector2(-1, -10)\ncache/0/16/0/glyphs/89/size = Vector2(11, 11)\ncache/0/16/0/glyphs/89/uv_rect = Rect2(20, 21, 11, 11)\ncache/0/16/0/glyphs/89/texture_idx = 0\ncache/0/16/0/glyphs/35/advance = Vector2(14.375, 16.0938)\ncache/0/16/0/glyphs/35/offset = Vector2(-1, -13)\ncache/0/16/0/glyphs/35/size = Vector2(16, 16)\ncache/0/16/0/glyphs/35/uv_rect = Rect2(1, 67, 16, 16)\ncache/0/16/0/glyphs/35/texture_idx = 0\ncache/0/16/0/glyphs/27/advance = Vector2(9.14063, 16.0938)\ncache/0/16/0/glyphs/27/offset = Vector2(-1, -13)\ncache/0/16/0/glyphs/27/size = Vector2(11, 14)\ncache/0/16/0/glyphs/27/uv_rect = Rect2(52, 34, 11, 14)\ncache/0/16/0/glyphs/27/texture_idx = 0\ncache/0/16/0/glyphs/20/advance = Vector2(9.14063, 16.0938)\ncache/0/16/0/glyphs/20/offset = Vector2(0, -13)\ncache/0/16/0/glyphs/20/size = Vector2(8, 14)\ncache/0/16/0/glyphs/20/uv_rect = Rect2(65, 34, 8, 14)\ncache/0/16/0/glyphs/20/texture_idx = 0\ncache/0/16/0/glyphs/40/advance = Vector2(8.9375, 16.0938)\ncache/0/16/0/glyphs/40/offset = Vector2(0, -13)\ncache/0/16/0/glyphs/40/size = Vector2(9, 14)\ncache/0/16/0/glyphs/40/uv_rect = Rect2(75, 34, 9, 14)\ncache/0/16/0/glyphs/40/texture_idx = 0\ncache/0/16/0/glyphs/92/advance = Vector2(8.57813, 16.0938)\ncache/0/16/0/glyphs/92/offset = Vector2(-1, -10)\ncache/0/16/0/glyphs/92/size = Vector2(11, 15)\ncache/0/16/0/glyphs/92/uv_rect = Rect2(14, 50, 11, 15)\ncache/0/16/0/glyphs/92/texture_idx = 0\ncache/0/16/0/glyphs/83/advance = Vector2(9.96875, 16.0938)\ncache/0/16/0/glyphs/83/offset = Vector2(0, -10)\ncache/0/16/0/glyphs/83/size = Vector2(11, 15)\ncache/0/16/0/glyphs/83/uv_rect = Rect2(27, 50, 11, 15)\ncache/0/16/0/glyphs/83/texture_idx = 0\ncache/0/16/0/glyphs/77/advance = Vector2(4.46875, 16.0938)\ncache/0/16/0/glyphs/77/offset = Vector2(-2, -13)\ncache/0/16/0/glyphs/77/size = Vector2(7, 18)\ncache/0/16/0/glyphs/77/uv_rect = Rect2(1, 85, 7, 18)\ncache/0/16/0/glyphs/77/texture_idx = 0\ncache/0/16/0/glyphs/21/advance = Vector2(9.14063, 16.0938)\ncache/0/16/0/glyphs/21/offset = Vector2(-1, -13)\ncache/0/16/0/glyphs/21/size = Vector2(11, 14)\ncache/0/16/0/glyphs/21/uv_rect = Rect2(86, 34, 11, 14)\ncache/0/16/0/glyphs/21/texture_idx = 0\ncache/0/16/0/glyphs/16/advance = Vector2(5.15625, 16.0938)\ncache/0/16/0/glyphs/16/offset = Vector2(-1, -7)\ncache/0/16/0/glyphs/16/size = Vector2(7, 4)\ncache/0/16/0/glyphs/16/uv_rect = Rect2(33, 21, 7, 4)\ncache/0/16/0/glyphs/16/texture_idx = 0\ncache/0/16/0/glyphs/47/advance = Vector2(8.67188, 16.0938)\ncache/0/16/0/glyphs/47/offset = Vector2(0, -13)\ncache/0/16/0/glyphs/47/size = Vector2(10, 14)\ncache/0/16/0/glyphs/47/uv_rect = Rect2(99, 34, 10, 14)\ncache/0/16/0/glyphs/47/texture_idx = 0\ncache/0/16/0/glyphs/73/advance = Vector2(5.8125, 16.0938)\ncache/0/16/0/glyphs/73/offset = Vector2(-1, -13)\ncache/0/16/0/glyphs/73/size = Vector2(9, 14)\ncache/0/16/0/glyphs/73/uv_rect = Rect2(111, 34, 9, 14)\ncache/0/16/0/glyphs/73/texture_idx = 0\ncache/0/16/0/glyphs/22/advance = Vector2(9.14063, 16.0938)\ncache/0/16/0/glyphs/22/offset = Vector2(-1, -13)\ncache/0/16/0/glyphs/22/size = Vector2(11, 14)\ncache/0/16/0/glyphs/22/uv_rect = Rect2(122, 34, 11, 14)\ncache/0/16/0/glyphs/22/texture_idx = 0\ncache/0/16/0/glyphs/26/advance = Vector2(9.14063, 16.0938)\ncache/0/16/0/glyphs/26/offset = Vector2(-1, -13)\ncache/0/16/0/glyphs/26/size = Vector2(11, 14)\ncache/0/16/0/glyphs/26/uv_rect = Rect2(135, 34, 11, 14)\ncache/0/16/0/glyphs/26/texture_idx = 0\ncache/0/16/0/glyphs/25/advance = Vector2(9.14063, 16.0938)\ncache/0/16/0/glyphs/25/offset = Vector2(-1, -13)\ncache/0/16/0/glyphs/25/size = Vector2(11, 14)\ncache/0/16/0/glyphs/25/uv_rect = Rect2(148, 34, 11, 14)\ncache/0/16/0/glyphs/25/texture_idx = 0\ncache/0/16/0/glyphs/54/advance = Vector2(8.79688, 16.0938)\ncache/0/16/0/glyphs/54/offset = Vector2(-1, -13)\ncache/0/16/0/glyphs/54/size = Vector2(11, 14)\ncache/0/16/0/glyphs/54/uv_rect = Rect2(161, 34, 11, 14)\ncache/0/16/0/glyphs/54/texture_idx = 0\ncache/0/16/0/glyphs/23/advance = Vector2(9.14063, 16.0938)\ncache/0/16/0/glyphs/23/offset = Vector2(-1, -13)\ncache/0/16/0/glyphs/23/size = Vector2(11, 14)\ncache/0/16/0/glyphs/23/uv_rect = Rect2(174, 34, 11, 14)\ncache/0/16/0/glyphs/23/texture_idx = 0\ncache/0/16/0/glyphs/69/advance = Vector2(9.96875, 16.0938)\ncache/0/16/0/glyphs/69/offset = Vector2(0, -13)\ncache/0/16/0/glyphs/69/size = Vector2(11, 14)\ncache/0/16/0/glyphs/69/uv_rect = Rect2(187, 34, 11, 14)\ncache/0/16/0/glyphs/69/texture_idx = 0\ncache/0/16/0/glyphs/17/advance = Vector2(4.40625, 16.0938)\ncache/0/16/0/glyphs/17/offset = Vector2(0, -4)\ncache/0/16/0/glyphs/17/size = Vector2(5, 5)\ncache/0/16/0/glyphs/17/uv_rect = Rect2(42, 21, 5, 5)\ncache/0/16/0/glyphs/17/texture_idx = 0\ncache/0/16/0/glyphs/918/advance = Vector2(4.89063, 16.0938)\ncache/0/16/0/glyphs/918/offset = Vector2(0, -13)\ncache/0/16/0/glyphs/918/size = Vector2(5, 14)\ncache/0/16/0/glyphs/918/uv_rect = Rect2(200, 34, 5, 14)\ncache/0/16/0/glyphs/918/texture_idx = 0\ncache/0/16/0/glyphs/42/advance = Vector2(11.625, 16.0938)\ncache/0/16/0/glyphs/42/offset = Vector2(-1, -13)\ncache/0/16/0/glyphs/42/size = Vector2(13, 14)\ncache/0/16/0/glyphs/42/uv_rect = Rect2(207, 34, 13, 14)\ncache/0/16/0/glyphs/42/texture_idx = 0\ncache/0/16/0/glyphs/55/advance = Vector2(9.0625, 16.0938)\ncache/0/16/0/glyphs/55/offset = Vector2(-1, -13)\ncache/0/16/0/glyphs/55/size = Vector2(11, 14)\ncache/0/16/0/glyphs/55/uv_rect = Rect2(222, 34, 11, 14)\ncache/0/16/0/glyphs/55/texture_idx = 0\ncache/0/16/0/glyphs/49/advance = Vector2(12.5313, 16.0938)\ncache/0/16/0/glyphs/49/offset = Vector2(0, -13)\ncache/0/16/0/glyphs/49/size = Vector2(13, 14)\ncache/0/16/0/glyphs/49/uv_rect = Rect2(235, 34, 13, 14)\ncache/0/16/0/glyphs/49/texture_idx = 0\ncache/0/16/0/glyphs/36/advance = Vector2(10.5781, 16.0938)\ncache/0/16/0/glyphs/36/offset = Vector2(-1, -13)\ncache/0/16/0/glyphs/36/size = Vector2(13, 14)\ncache/0/16/0/glyphs/36/uv_rect = Rect2(40, 50, 13, 14)\ncache/0/16/0/glyphs/36/texture_idx = 0\ncache/0/16/0/glyphs/90/advance = Vector2(13.0781, 16.0938)\ncache/0/16/0/glyphs/90/offset = Vector2(-1, -10)\ncache/0/16/0/glyphs/90/size = Vector2(15, 11)\ncache/0/16/0/glyphs/90/uv_rect = Rect2(49, 21, 15, 11)\ncache/0/16/0/glyphs/90/texture_idx = 0\ncache/0/16/0/glyphs/57/advance = Vector2(9.95313, 16.0938)\ncache/0/16/0/glyphs/57/offset = Vector2(-1, -13)\ncache/0/16/0/glyphs/57/size = Vector2(12, 14)\ncache/0/16/0/glyphs/57/uv_rect = Rect2(55, 50, 12, 14)\ncache/0/16/0/glyphs/57/texture_idx = 0\ncache/0/16/0/glyphs/53/advance = Vector2(10.2344, 16.0938)\ncache/0/16/0/glyphs/53/offset = Vector2(0, -13)\ncache/0/16/0/glyphs/53/size = Vector2(12, 14)\ncache/0/16/0/glyphs/53/uv_rect = Rect2(69, 50, 12, 14)\ncache/0/16/0/glyphs/53/texture_idx = 0\ncache/0/16/0/glyphs/93/advance = Vector2(7.65625, 16.0938)\ncache/0/16/0/glyphs/93/offset = Vector2(-1, -10)\ncache/0/16/0/glyphs/93/size = Vector2(10, 11)\ncache/0/16/0/glyphs/93/uv_rect = Rect2(66, 21, 10, 11)\ncache/0/16/0/glyphs/93/texture_idx = 0\ncache/0/16/0/glyphs/75/advance = Vector2(10.1563, 16.0938)\ncache/0/16/0/glyphs/75/offset = Vector2(0, -13)\ncache/0/16/0/glyphs/75/size = Vector2(10, 14)\ncache/0/16/0/glyphs/75/uv_rect = Rect2(83, 50, 10, 14)\ncache/0/16/0/glyphs/75/texture_idx = 0\ncache/0/16/0/glyphs/5/advance = Vector2(6.98438, 16.0938)\ncache/0/16/0/glyphs/5/offset = Vector2(0, -13)\ncache/0/16/0/glyphs/5/size = Vector2(7, 7)\ncache/0/16/0/glyphs/5/uv_rect = Rect2(78, 21, 7, 7)\ncache/0/16/0/glyphs/5/texture_idx = 0\ncache/0/16/0/glyphs/66/advance = Vector2(6.875, 16.0938)\ncache/0/16/0/glyphs/66/offset = Vector2(-2, 0)\ncache/0/16/0/glyphs/66/size = Vector2(10, 4)\ncache/0/16/0/glyphs/66/uv_rect = Rect2(87, 21, 10, 4)\ncache/0/16/0/glyphs/66/texture_idx = 0\ncache/0/16/0/glyphs/33/advance = Vector2(9.14063, 16.0938)\ncache/0/16/0/glyphs/33/offset = Vector2(-1, -12)\ncache/0/16/0/glyphs/33/size = Vector2(11, 12)\ncache/0/16/0/glyphs/33/uv_rect = Rect2(95, 50, 11, 12)\ncache/0/16/0/glyphs/33/texture_idx = 0\ncache/0/16/0/glyphs/564/advance = Vector2(10.2813, 16.0938)\ncache/0/16/0/glyphs/564/offset = Vector2(-1, -13)\ncache/0/16/0/glyphs/564/size = Vector2(12, 14)\ncache/0/16/0/glyphs/564/uv_rect = Rect2(108, 50, 12, 14)\ncache/0/16/0/glyphs/564/texture_idx = 0\ncache/0/16/0/glyphs/56/advance = Vector2(11.875, 16.0938)\ncache/0/16/0/glyphs/56/offset = Vector2(0, -13)\ncache/0/16/0/glyphs/56/size = Vector2(12, 14)\ncache/0/16/0/glyphs/56/uv_rect = Rect2(122, 50, 12, 14)\ncache/0/16/0/glyphs/56/texture_idx = 0\ncache/0/16/0/glyphs/11/advance = Vector2(5.07813, 16.0938)\ncache/0/16/0/glyphs/11/offset = Vector2(-1, -13)\ncache/0/16/0/glyphs/11/size = Vector2(7, 17)\ncache/0/16/0/glyphs/11/uv_rect = Rect2(10, 85, 7, 17)\ncache/0/16/0/glyphs/11/texture_idx = 0\ncache/0/16/0/glyphs/12/advance = Vector2(5.07813, 16.0938)\ncache/0/16/0/glyphs/12/offset = Vector2(-1, -13)\ncache/0/16/0/glyphs/12/size = Vector2(7, 17)\ncache/0/16/0/glyphs/12/uv_rect = Rect2(19, 85, 7, 17)\ncache/0/16/0/glyphs/12/texture_idx = 0\ncache/0/16/0/glyphs/15/advance = Vector2(4.28125, 16.0938)\ncache/0/16/0/glyphs/15/offset = Vector2(-1, -4)\ncache/0/16/0/glyphs/15/size = Vector2(6, 7)\ncache/0/16/0/glyphs/15/uv_rect = Rect2(99, 21, 6, 7)\ncache/0/16/0/glyphs/15/texture_idx = 0\ncache/0/16/0/glyphs/605/advance = Vector2(16.0781, 16.0938)\ncache/0/16/0/glyphs/605/offset = Vector2(-1, -13)\ncache/0/16/0/glyphs/605/size = Vector2(17, 14)\ncache/0/16/0/glyphs/605/uv_rect = Rect2(136, 50, 17, 14)\ncache/0/16/0/glyphs/605/texture_idx = 0\ncache/0/16/0/glyphs/60/advance = Vector2(9.46875, 16.0938)\ncache/0/16/0/glyphs/60/offset = Vector2(-1, -13)\ncache/0/16/0/glyphs/60/size = Vector2(12, 14)\ncache/0/16/0/glyphs/60/uv_rect = Rect2(155, 50, 12, 14)\ncache/0/16/0/glyphs/60/texture_idx = 0\ncache/0/16/0/glyphs/8/advance = Vector2(13.7969, 16.0938)\ncache/0/16/0/glyphs/8/offset = Vector2(-1, -13)\ncache/0/16/0/glyphs/8/size = Vector2(16, 14)\ncache/0/16/0/glyphs/8/uv_rect = Rect2(169, 50, 16, 14)\ncache/0/16/0/glyphs/8/texture_idx = 0\ncache/0/16/0/glyphs/37/advance = Vector2(10.5625, 16.0938)\ncache/0/16/0/glyphs/37/offset = Vector2(0, -13)\ncache/0/16/0/glyphs/37/size = Vector2(11, 14)\ncache/0/16/0/glyphs/37/uv_rect = Rect2(187, 50, 11, 14)\ncache/0/16/0/glyphs/37/texture_idx = 0\ncache/0/16/0/glyphs/58/advance = Vector2(15.1406, 16.0938)\ncache/0/16/0/glyphs/58/offset = Vector2(-1, -13)\ncache/0/16/0/glyphs/58/size = Vector2(18, 14)\ncache/0/16/0/glyphs/58/uv_rect = Rect2(200, 50, 18, 14)\ncache/0/16/0/glyphs/58/texture_idx = 0\ncache/0/16/0/glyphs/6/advance = Vector2(10.3438, 16.0938)\ncache/0/16/0/glyphs/6/offset = Vector2(-1, -13)\ncache/0/16/0/glyphs/6/size = Vector2(12, 14)\ncache/0/16/0/glyphs/6/uv_rect = Rect2(220, 50, 12, 14)\ncache/0/16/0/glyphs/6/texture_idx = 0\ncache/0/16/0/glyphs/24/advance = Vector2(9.14063, 16.0938)\ncache/0/16/0/glyphs/24/offset = Vector2(-1, -13)\ncache/0/16/0/glyphs/24/size = Vector2(11, 14)\ncache/0/16/0/glyphs/24/uv_rect = Rect2(234, 50, 11, 14)\ncache/0/16/0/glyphs/24/texture_idx = 0\ncache/0/16/0/glyphs/153/advance = Vector2(9.14063, 16.0938)\ncache/0/16/0/glyphs/153/offset = Vector2(0, -11)\ncache/0/16/0/glyphs/153/size = Vector2(10, 10)\ncache/0/16/0/glyphs/153/uv_rect = Rect2(107, 21, 10, 10)\ncache/0/16/0/glyphs/153/texture_idx = 0\ncache/0/16/0/glyphs/28/advance = Vector2(9.14063, 16.0938)\ncache/0/16/0/glyphs/28/offset = Vector2(-1, -13)\ncache/0/16/0/glyphs/28/size = Vector2(11, 14)\ncache/0/16/0/glyphs/28/uv_rect = Rect2(19, 67, 11, 14)\ncache/0/16/0/glyphs/28/texture_idx = 0\ncache/0/16/0/glyphs/31/advance = Vector2(9.14063, 16.0938)\ncache/0/16/0/glyphs/31/offset = Vector2(-1, -12)\ncache/0/16/0/glyphs/31/size = Vector2(11, 12)\ncache/0/16/0/glyphs/31/uv_rect = Rect2(32, 67, 11, 12)\ncache/0/16/0/glyphs/31/texture_idx = 0\ncache/0/16/0/glyphs/62/advance = Vector2(5.28125, 16.0938)\ncache/0/16/0/glyphs/62/offset = Vector2(0, -13)\ncache/0/16/0/glyphs/62/size = Vector2(6, 17)\ncache/0/16/0/glyphs/62/uv_rect = Rect2(28, 85, 6, 17)\ncache/0/16/0/glyphs/62/texture_idx = 0\ncache/0/16/0/glyphs/64/advance = Vector2(5.28125, 16.0938)\ncache/0/16/0/glyphs/64/offset = Vector2(-1, -13)\ncache/0/16/0/glyphs/64/size = Vector2(7, 17)\ncache/0/16/0/glyphs/64/uv_rect = Rect2(36, 85, 7, 17)\ncache/0/16/0/glyphs/64/texture_idx = 0\ncache/0/16/0/glyphs/909/advance = Vector2(11.625, 16.0938)\ncache/0/16/0/glyphs/909/offset = Vector2(-1, -13)\ncache/0/16/0/glyphs/909/size = Vector2(15, 14)\ncache/0/16/0/glyphs/909/uv_rect = Rect2(45, 67, 15, 14)\ncache/0/16/0/glyphs/909/texture_idx = 0\ncache/0/16/0/glyphs/13/advance = Vector2(8.76563, 16.0938)\ncache/0/16/0/glyphs/13/offset = Vector2(-1, -13)\ncache/0/16/0/glyphs/13/size = Vector2(11, 10)\ncache/0/16/0/glyphs/13/uv_rect = Rect2(119, 21, 11, 10)\ncache/0/16/0/glyphs/13/texture_idx = 0\ncache/0/16/0/glyphs/10/advance = Vector2(3.89063, 16.0938)\ncache/0/16/0/glyphs/10/offset = Vector2(0, -13)\ncache/0/16/0/glyphs/10/size = Vector2(4, 7)\ncache/0/16/0/glyphs/10/uv_rect = Rect2(132, 21, 4, 7)\ncache/0/16/0/glyphs/10/texture_idx = 0\ncache/0/16/0/glyphs/32/advance = Vector2(9.14063, 16.0938)\ncache/0/16/0/glyphs/32/offset = Vector2(-1, -10)\ncache/0/16/0/glyphs/32/size = Vector2(11, 8)\ncache/0/16/0/glyphs/32/uv_rect = Rect2(138, 21, 11, 8)\ncache/0/16/0/glyphs/32/texture_idx = 0\ncache/0/16/0/glyphs/52/advance = Vector2(12.5938, 16.0938)\ncache/0/16/0/glyphs/52/offset = Vector2(-1, -13)\ncache/0/16/0/glyphs/52/size = Vector2(14, 17)\ncache/0/16/0/glyphs/52/uv_rect = Rect2(45, 85, 14, 17)\ncache/0/16/0/glyphs/52/texture_idx = 0\ncache/0/16/0/glyphs/84/advance = Vector2(9.96875, 16.0938)\ncache/0/16/0/glyphs/84/offset = Vector2(-1, -10)\ncache/0/16/0/glyphs/84/size = Vector2(11, 15)\ncache/0/16/0/glyphs/84/uv_rect = Rect2(62, 67, 11, 15)\ncache/0/16/0/glyphs/84/texture_idx = 0\ncache/0/16/0/glyphs/94/advance = Vector2(6.1875, 16.0938)\ncache/0/16/0/glyphs/94/offset = Vector2(-1, -13)\ncache/0/16/0/glyphs/94/size = Vector2(8, 17)\ncache/0/16/0/glyphs/94/uv_rect = Rect2(61, 85, 8, 17)\ncache/0/16/0/glyphs/94/texture_idx = 0\ncache/0/16/0/glyphs/96/advance = Vector2(5.9375, 16.0938)\ncache/0/16/0/glyphs/96/offset = Vector2(-1, -13)\ncache/0/16/0/glyphs/96/size = Vector2(8, 17)\ncache/0/16/0/glyphs/96/uv_rect = Rect2(71, 85, 8, 17)\ncache/0/16/0/glyphs/96/texture_idx = 0\ncache/0/16/0/glyphs/565/advance = Vector2(10.2813, 16.0938)\ncache/0/16/0/glyphs/565/offset = Vector2(-1, -13)\ncache/0/16/0/glyphs/565/size = Vector2(11, 14)\ncache/0/16/0/glyphs/565/uv_rect = Rect2(75, 67, 11, 14)\ncache/0/16/0/glyphs/565/texture_idx = 0\ncache/0/16/0/glyphs/606/advance = Vector2(16.0781, 16.0938)\ncache/0/16/0/glyphs/606/offset = Vector2(-1, -13)\ncache/0/16/0/glyphs/606/size = Vector2(17, 14)\ncache/0/16/0/glyphs/606/uv_rect = Rect2(88, 67, 17, 14)\ncache/0/16/0/glyphs/606/texture_idx = 0\ncache/0/16/0/glyphs/45/advance = Vector2(4.78125, 16.0938)\ncache/0/16/0/glyphs/45/offset = Vector2(-3, -13)\ncache/0/16/0/glyphs/45/size = Vector2(8, 17)\ncache/0/16/0/glyphs/45/uv_rect = Rect2(81, 85, 8, 17)\ncache/0/16/0/glyphs/45/texture_idx = 0\ncache/0/16/0/glyphs/97/advance = Vector2(9.14063, 16.0938)\ncache/0/16/0/glyphs/97/offset = Vector2(-1, -9)\ncache/0/16/0/glyphs/97/size = Vector2(11, 6)\ncache/0/16/0/glyphs/97/uv_rect = Rect2(151, 21, 11, 6)\ncache/0/16/0/glyphs/97/texture_idx = 0\ncache/0/16/0/glyphs/95/advance = Vector2(8.8125, 16.0938)\ncache/0/16/0/glyphs/95/offset = Vector2(2, -13)\ncache/0/16/0/glyphs/95/size = Vector2(5, 18)\ncache/0/16/0/glyphs/95/uv_rect = Rect2(91, 85, 5, 18)\ncache/0/16/0/glyphs/95/texture_idx = 0\ncache/0/16/0/glyphs/59/advance = Vector2(9.95313, 16.0938)\ncache/0/16/0/glyphs/59/offset = Vector2(-1, -13)\ncache/0/16/0/glyphs/59/size = Vector2(12, 14)\ncache/0/16/0/glyphs/59/uv_rect = Rect2(107, 67, 12, 14)\ncache/0/16/0/glyphs/59/texture_idx = 0\ncache/0/16/0/glyphs/61/advance = Vector2(9.20313, 16.0938)\ncache/0/16/0/glyphs/61/offset = Vector2(-1, -13)\ncache/0/16/0/glyphs/61/size = Vector2(11, 14)\ncache/0/16/0/glyphs/61/uv_rect = Rect2(121, 67, 11, 14)\ncache/0/16/0/glyphs/61/texture_idx = 0\ncache/0/16/0/glyphs/4/advance = Vector2(4.42188, 16.0938)\ncache/0/16/0/glyphs/4/offset = Vector2(0, -13)\ncache/0/16/0/glyphs/4/size = Vector2(5, 14)\ncache/0/16/0/glyphs/4/uv_rect = Rect2(250, 34, 5, 14)\ncache/0/16/0/glyphs/4/texture_idx = 0\ncache/0/16/0/glyphs/67/advance = Vector2(9.46875, 16.0938)\ncache/0/16/0/glyphs/67/offset = Vector2(1, -14)\ncache/0/16/0/glyphs/67/size = Vector2(7, 5)\ncache/0/16/0/glyphs/67/uv_rect = Rect2(164, 21, 7, 5)\ncache/0/16/0/glyphs/67/texture_idx = 0\ncache/0/16/0/glyphs/63/advance = Vector2(6.25, 16.0938)\ncache/0/16/0/glyphs/63/offset = Vector2(-1, -13)\ncache/0/16/0/glyphs/63/size = Vector2(9, 14)\ncache/0/16/0/glyphs/63/uv_rect = Rect2(134, 67, 9, 14)\ncache/0/16/0/glyphs/63/texture_idx = 0\ncache/0/16/0/glyphs/7/advance = Vector2(9.14063, 16.0938)\ncache/0/16/0/glyphs/7/offset = Vector2(-1, -13)\ncache/0/16/0/glyphs/7/size = Vector2(11, 16)\ncache/0/16/0/glyphs/7/uv_rect = Rect2(145, 67, 11, 16)\ncache/0/16/0/glyphs/7/texture_idx = 0\ncache/0/16/0/glyphs/14/advance = Vector2(9.14063, 16.0938)\ncache/0/16/0/glyphs/14/offset = Vector2(-1, -11)\ncache/0/16/0/glyphs/14/size = Vector2(11, 10)\ncache/0/16/0/glyphs/14/uv_rect = Rect2(173, 21, 11, 10)\ncache/0/16/0/glyphs/14/texture_idx = 0\ncache/0/16/0/glyphs/268435528/advance = Vector2(9.21875, 16.0938)\ncache/0/16/0/glyphs/268435528/offset = Vector2(0, -10)\ncache/0/16/0/glyphs/268435528/size = Vector2(10, 11)\ncache/0/16/0/glyphs/268435528/uv_rect = Rect2(186, 21, 10, 11)\ncache/0/16/0/glyphs/268435528/texture_idx = 0\ncache/0/16/0/glyphs/402653274/advance = Vector2(13.0781, 16.0938)\ncache/0/16/0/glyphs/402653274/offset = Vector2(-1, -10)\ncache/0/16/0/glyphs/402653274/size = Vector2(16, 11)\ncache/0/16/0/glyphs/402653274/uv_rect = Rect2(198, 21, 16, 11)\ncache/0/16/0/glyphs/402653274/texture_idx = 0\ncache/0/16/0/glyphs/134217796/advance = Vector2(9.28125, 16.0938)\ncache/0/16/0/glyphs/134217796/offset = Vector2(-1, -10)\ncache/0/16/0/glyphs/134217796/size = Vector2(11, 11)\ncache/0/16/0/glyphs/134217796/uv_rect = Rect2(216, 21, 11, 11)\ncache/0/16/0/glyphs/134217796/texture_idx = 0\ncache/0/16/0/glyphs/268435537/advance = Vector2(10.1563, 16.0938)\ncache/0/16/0/glyphs/268435537/offset = Vector2(0, -10)\ncache/0/16/0/glyphs/268435537/size = Vector2(11, 11)\ncache/0/16/0/glyphs/268435537/uv_rect = Rect2(229, 21, 11, 11)\ncache/0/16/0/glyphs/268435537/texture_idx = 0\ncache/0/16/0/glyphs/402653262/advance = Vector2(9.15625, 16.0938)\ncache/0/16/0/glyphs/402653262/offset = Vector2(1, -13)\ncache/0/16/0/glyphs/402653262/size = Vector2(10, 14)\ncache/0/16/0/glyphs/402653262/uv_rect = Rect2(158, 67, 10, 14)\ncache/0/16/0/glyphs/402653262/texture_idx = 0\ncache/0/16/0/glyphs/402653238/advance = Vector2(8.79688, 16.0938)\ncache/0/16/0/glyphs/402653238/offset = Vector2(0, -13)\ncache/0/16/0/glyphs/402653238/size = Vector2(10, 14)\ncache/0/16/0/glyphs/402653238/uv_rect = Rect2(170, 67, 10, 14)\ncache/0/16/0/glyphs/402653238/texture_idx = 0\ncache/0/16/0/glyphs/402653254/advance = Vector2(7.92188, 16.0938)\ncache/0/16/0/glyphs/402653254/offset = Vector2(0, -10)\ncache/0/16/0/glyphs/402653254/size = Vector2(10, 11)\ncache/0/16/0/glyphs/402653254/uv_rect = Rect2(242, 21, 10, 11)\ncache/0/16/0/glyphs/402653254/texture_idx = 0\ncache/0/16/0/glyphs/268435538/advance = Vector2(9.78125, 16.0938)\ncache/0/16/0/glyphs/268435538/offset = Vector2(0, -10)\ncache/0/16/0/glyphs/268435538/size = Vector2(11, 11)\ncache/0/16/0/glyphs/268435538/uv_rect = Rect2(182, 67, 11, 11)\ncache/0/16/0/glyphs/268435538/texture_idx = 0\ncache/0/16/0/glyphs/134217813/advance = Vector2(6.90625, 16.0938)\ncache/0/16/0/glyphs/134217813/offset = Vector2(0, -10)\ncache/0/16/0/glyphs/134217813/size = Vector2(8, 11)\ncache/0/16/0/glyphs/134217813/uv_rect = Rect2(247, 50, 8, 11)\ncache/0/16/0/glyphs/134217813/texture_idx = 0\ncache/0/16/0/glyphs/134217800/advance = Vector2(9.21875, 16.0938)\ncache/0/16/0/glyphs/134217800/offset = Vector2(0, -10)\ncache/0/16/0/glyphs/134217800/size = Vector2(10, 11)\ncache/0/16/0/glyphs/134217800/uv_rect = Rect2(195, 67, 10, 11)\ncache/0/16/0/glyphs/134217800/texture_idx = 0\ncache/0/16/0/glyphs/268435512/advance = Vector2(11.875, 16.0938)\ncache/0/16/0/glyphs/268435512/offset = Vector2(0, -13)\ncache/0/16/0/glyphs/268435512/size = Vector2(12, 14)\ncache/0/16/0/glyphs/268435512/uv_rect = Rect2(207, 67, 12, 14)\ncache/0/16/0/glyphs/268435512/texture_idx = 0\ncache/0/16/0/glyphs/134217814/advance = Vector2(7.79688, 16.0938)\ncache/0/16/0/glyphs/134217814/offset = Vector2(0, -10)\ncache/0/16/0/glyphs/134217814/size = Vector2(9, 11)\ncache/0/16/0/glyphs/134217814/uv_rect = Rect2(221, 67, 9, 11)\ncache/0/16/0/glyphs/134217814/texture_idx = 0\ncache/0/16/0/glyphs/268435543/advance = Vector2(6.29688, 16.0938)\ncache/0/16/0/glyphs/268435543/offset = Vector2(-1, -12)\ncache/0/16/0/glyphs/268435543/size = Vector2(9, 13)\ncache/0/16/0/glyphs/268435543/uv_rect = Rect2(232, 67, 9, 13)\ncache/0/16/0/glyphs/268435543/texture_idx = 0\ncache/0/16/0/glyphs/402653256/advance = Vector2(9.21875, 16.0938)\ncache/0/16/0/glyphs/402653256/offset = Vector2(0, -10)\ncache/0/16/0/glyphs/402653256/size = Vector2(11, 11)\ncache/0/16/0/glyphs/402653256/uv_rect = Rect2(243, 67, 11, 11)\ncache/0/16/0/glyphs/402653256/texture_idx = 0\ncache/0/16/0/glyphs/134217807/advance = Vector2(4.46875, 16.0938)\ncache/0/16/0/glyphs/134217807/offset = Vector2(0, -13)\ncache/0/16/0/glyphs/134217807/size = Vector2(5, 14)\ncache/0/16/0/glyphs/134217807/uv_rect = Rect2(98, 85, 5, 14)\ncache/0/16/0/glyphs/134217807/texture_idx = 0\ncache/0/16/0/glyphs/402653266/advance = Vector2(9.78125, 16.0938)\ncache/0/16/0/glyphs/402653266/offset = Vector2(0, -10)\ncache/0/16/0/glyphs/402653266/size = Vector2(11, 11)\ncache/0/16/0/glyphs/402653266/uv_rect = Rect2(105, 85, 11, 11)\ncache/0/16/0/glyphs/402653266/texture_idx = 0\ncache/0/16/0/glyphs/268435525/advance = Vector2(9.96875, 16.0938)\ncache/0/16/0/glyphs/268435525/offset = Vector2(0, -13)\ncache/0/16/0/glyphs/268435525/size = Vector2(11, 14)\ncache/0/16/0/glyphs/268435525/uv_rect = Rect2(118, 85, 11, 14)\ncache/0/16/0/glyphs/268435525/texture_idx = 0\ncache/0/16/0/glyphs/268435548/advance = Vector2(8.57813, 16.0938)\ncache/0/16/0/glyphs/268435548/offset = Vector2(-1, -10)\ncache/0/16/0/glyphs/268435548/size = Vector2(12, 15)\ncache/0/16/0/glyphs/268435548/uv_rect = Rect2(131, 85, 12, 15)\ncache/0/16/0/glyphs/268435548/texture_idx = 0\ncache/0/16/0/glyphs/268435529/advance = Vector2(5.8125, 16.0938)\ncache/0/16/0/glyphs/268435529/offset = Vector2(-1, -13)\ncache/0/16/0/glyphs/268435529/size = Vector2(10, 14)\ncache/0/16/0/glyphs/268435529/uv_rect = Rect2(145, 85, 10, 14)\ncache/0/16/0/glyphs/268435529/texture_idx = 0\ncache/0/16/0/glyphs/268435542/advance = Vector2(7.79688, 16.0938)\ncache/0/16/0/glyphs/268435542/offset = Vector2(0, -10)\ncache/0/16/0/glyphs/268435542/size = Vector2(9, 11)\ncache/0/16/0/glyphs/268435542/uv_rect = Rect2(157, 85, 9, 11)\ncache/0/16/0/glyphs/268435542/texture_idx = 0\ncache/0/16/0/glyphs/134217803/advance = Vector2(10.1563, 16.0938)\ncache/0/16/0/glyphs/134217803/offset = Vector2(0, -13)\ncache/0/16/0/glyphs/134217803/size = Vector2(11, 14)\ncache/0/16/0/glyphs/134217803/uv_rect = Rect2(168, 85, 11, 14)\ncache/0/16/0/glyphs/134217803/texture_idx = 0\ncache/0/16/0/glyphs/402653213/advance = Vector2(4.40625, 16.0938)\ncache/0/16/0/glyphs/402653213/offset = Vector2(0, -10)\ncache/0/16/0/glyphs/402653213/size = Vector2(6, 11)\ncache/0/16/0/glyphs/402653213/uv_rect = Rect2(181, 85, 6, 11)\ncache/0/16/0/glyphs/402653213/texture_idx = 0\ncache/0/16/0/glyphs/268435526/advance = Vector2(7.92188, 16.0938)\ncache/0/16/0/glyphs/268435526/offset = Vector2(0, -10)\ncache/0/16/0/glyphs/268435526/size = Vector2(9, 11)\ncache/0/16/0/glyphs/268435526/uv_rect = Rect2(189, 85, 9, 11)\ncache/0/16/0/glyphs/268435526/texture_idx = 0\ncache/0/16/0/glyphs/268435531/advance = Vector2(10.1563, 16.0938)\ncache/0/16/0/glyphs/268435531/offset = Vector2(0, -13)\ncache/0/16/0/glyphs/268435531/size = Vector2(11, 14)\ncache/0/16/0/glyphs/268435531/uv_rect = Rect2(200, 85, 11, 14)\ncache/0/16/0/glyphs/268435531/texture_idx = 0\ncache/0/16/0/glyphs/268435532/advance = Vector2(4.46875, 16.0938)\ncache/0/16/0/glyphs/268435532/offset = Vector2(0, -13)\ncache/0/16/0/glyphs/268435532/size = Vector2(5, 14)\ncache/0/16/0/glyphs/268435532/uv_rect = Rect2(213, 85, 5, 14)\ncache/0/16/0/glyphs/268435532/texture_idx = 0\ncache/0/16/0/glyphs/134217817/advance = Vector2(8.5625, 16.0938)\ncache/0/16/0/glyphs/134217817/offset = Vector2(-1, -10)\ncache/0/16/0/glyphs/134217817/size = Vector2(11, 11)\ncache/0/16/0/glyphs/134217817/uv_rect = Rect2(220, 85, 11, 11)\ncache/0/16/0/glyphs/134217817/texture_idx = 0\ncache/0/16/0/glyphs/402653271/advance = Vector2(6.29688, 16.0938)\ncache/0/16/0/glyphs/402653271/offset = Vector2(0, -12)\ncache/0/16/0/glyphs/402653271/size = Vector2(8, 13)\ncache/0/16/0/glyphs/402653271/uv_rect = Rect2(233, 85, 8, 13)\ncache/0/16/0/glyphs/402653271/texture_idx = 0\ncache/0/16/0/glyphs/134217799/advance = Vector2(9.96875, 16.0938)\ncache/0/16/0/glyphs/134217799/offset = Vector2(0, -13)\ncache/0/16/0/glyphs/134217799/size = Vector2(10, 14)\ncache/0/16/0/glyphs/134217799/uv_rect = Rect2(243, 85, 10, 14)\ncache/0/16/0/glyphs/134217799/texture_idx = 0\ncache/0/16/0/glyphs/134217794/advance = Vector2(6.875, 16.0938)\ncache/0/16/0/glyphs/134217794/offset = Vector2(-1, 0)\ncache/0/16/0/glyphs/134217794/size = Vector2(10, 4)\ncache/0/16/0/glyphs/134217794/uv_rect = Rect2(1, 105, 10, 4)\ncache/0/16/0/glyphs/134217794/texture_idx = 0\ncache/0/16/0/glyphs/268435541/advance = Vector2(6.90625, 16.0938)\ncache/0/16/0/glyphs/268435541/offset = Vector2(0, -10)\ncache/0/16/0/glyphs/268435541/size = Vector2(9, 11)\ncache/0/16/0/glyphs/268435541/uv_rect = Rect2(1, 111, 9, 11)\ncache/0/16/0/glyphs/268435541/texture_idx = 0\ncache/0/16/0/glyphs/402653250/advance = Vector2(6.875, 16.0938)\ncache/0/16/0/glyphs/402653250/offset = Vector2(-1, 0)\ncache/0/16/0/glyphs/402653250/size = Vector2(10, 4)\ncache/0/16/0/glyphs/402653250/uv_rect = Rect2(13, 105, 10, 4)\ncache/0/16/0/glyphs/402653250/texture_idx = 0\ncache/0/16/0/glyphs/268435476/advance = Vector2(9.14063, 16.0938)\ncache/0/16/0/glyphs/268435476/offset = Vector2(0, -13)\ncache/0/16/0/glyphs/268435476/size = Vector2(8, 14)\ncache/0/16/0/glyphs/268435476/uv_rect = Rect2(1, 124, 8, 14)\ncache/0/16/0/glyphs/268435476/texture_idx = 0\ncache/0/16/0/glyphs/402653205/advance = Vector2(9.14063, 16.0938)\ncache/0/16/0/glyphs/402653205/offset = Vector2(0, -13)\ncache/0/16/0/glyphs/402653205/size = Vector2(11, 14)\ncache/0/16/0/glyphs/402653205/uv_rect = Rect2(11, 124, 11, 14)\ncache/0/16/0/glyphs/402653205/texture_idx = 0\ncache/0/16/0/glyphs/402653206/advance = Vector2(9.14063, 16.0938)\ncache/0/16/0/glyphs/402653206/offset = Vector2(0, -13)\ncache/0/16/0/glyphs/402653206/size = Vector2(11, 14)\ncache/0/16/0/glyphs/402653206/uv_rect = Rect2(24, 124, 11, 14)\ncache/0/16/0/glyphs/402653206/texture_idx = 0\ncache/0/16/0/glyphs/134217752/advance = Vector2(9.14063, 16.0938)\ncache/0/16/0/glyphs/134217752/offset = Vector2(0, -13)\ncache/0/16/0/glyphs/134217752/size = Vector2(10, 14)\ncache/0/16/0/glyphs/134217752/uv_rect = Rect2(37, 124, 10, 14)\ncache/0/16/0/glyphs/134217752/texture_idx = 0\ncache/0/16/0/glyphs/134217753/advance = Vector2(9.14063, 16.0938)\ncache/0/16/0/glyphs/134217753/offset = Vector2(-1, -13)\ncache/0/16/0/glyphs/134217753/size = Vector2(11, 14)\ncache/0/16/0/glyphs/134217753/uv_rect = Rect2(49, 124, 11, 14)\ncache/0/16/0/glyphs/134217753/texture_idx = 0\ncache/0/16/0/glyphs/268435482/advance = Vector2(9.14063, 16.0938)\ncache/0/16/0/glyphs/268435482/offset = Vector2(0, -13)\ncache/0/16/0/glyphs/268435482/size = Vector2(10, 14)\ncache/0/16/0/glyphs/268435482/uv_rect = Rect2(62, 124, 10, 14)\ncache/0/16/0/glyphs/268435482/texture_idx = 0\ncache/0/16/0/glyphs/268435483/advance = Vector2(9.14063, 16.0938)\ncache/0/16/0/glyphs/268435483/offset = Vector2(0, -13)\ncache/0/16/0/glyphs/268435483/size = Vector2(10, 14)\ncache/0/16/0/glyphs/268435483/uv_rect = Rect2(74, 124, 10, 14)\ncache/0/16/0/glyphs/268435483/texture_idx = 0\ncache/0/16/0/glyphs/402653212/advance = Vector2(9.14063, 16.0938)\ncache/0/16/0/glyphs/402653212/offset = Vector2(0, -13)\ncache/0/16/0/glyphs/402653212/size = Vector2(11, 14)\ncache/0/16/0/glyphs/402653212/uv_rect = Rect2(86, 124, 11, 14)\ncache/0/16/0/glyphs/402653212/texture_idx = 0\ncache/0/16/0/glyphs/402653260/advance = Vector2(4.46875, 16.0938)\ncache/0/16/0/glyphs/402653260/offset = Vector2(0, -13)\ncache/0/16/0/glyphs/402653260/size = Vector2(6, 14)\ncache/0/16/0/glyphs/402653260/uv_rect = Rect2(99, 124, 6, 14)\ncache/0/16/0/glyphs/402653260/texture_idx = 0\ncache/0/16/0/glyphs/134217808/advance = Vector2(15.2969, 16.0938)\ncache/0/16/0/glyphs/134217808/offset = Vector2(0, -10)\ncache/0/16/0/glyphs/134217808/size = Vector2(16, 11)\ncache/0/16/0/glyphs/134217808/uv_rect = Rect2(12, 111, 16, 11)\ncache/0/16/0/glyphs/134217808/texture_idx = 0\ncache/0/16/0/glyphs/402653265/advance = Vector2(10.1563, 16.0938)\ncache/0/16/0/glyphs/402653265/offset = Vector2(1, -10)\ncache/0/16/0/glyphs/402653265/size = Vector2(10, 11)\ncache/0/16/0/glyphs/402653265/uv_rect = Rect2(30, 111, 10, 11)\ncache/0/16/0/glyphs/402653265/texture_idx = 0\ncache/0/16/0/glyphs/134217731/advance = Vector2(4.15625, 16.0938)\ncache/0/16/0/glyphs/134217731/offset = Vector2(-1, -1)\ncache/0/16/0/glyphs/134217731/size = Vector2(2, 2)\ncache/0/16/0/glyphs/134217731/uv_rect = Rect2(5, 1, 2, 2)\ncache/0/16/0/glyphs/134217731/texture_idx = 0\ncache/0/16/0/glyphs/268435535/advance = Vector2(4.46875, 16.0938)\ncache/0/16/0/glyphs/268435535/offset = Vector2(0, -13)\ncache/0/16/0/glyphs/268435535/size = Vector2(5, 14)\ncache/0/16/0/glyphs/268435535/uv_rect = Rect2(107, 124, 5, 14)\ncache/0/16/0/glyphs/268435535/texture_idx = 0\ncache/0/16/0/glyphs/268435459/advance = Vector2(4.15625, 16.0938)\ncache/0/16/0/glyphs/268435459/offset = Vector2(-1, -1)\ncache/0/16/0/glyphs/268435459/size = Vector2(2, 2)\ncache/0/16/0/glyphs/268435459/uv_rect = Rect2(9, 1, 2, 2)\ncache/0/16/0/glyphs/268435459/texture_idx = 0\ncache/0/16/0/glyphs/402653239/advance = Vector2(9.0625, 16.0938)\ncache/0/16/0/glyphs/402653239/offset = Vector2(-1, -13)\ncache/0/16/0/glyphs/402653239/size = Vector2(12, 14)\ncache/0/16/0/glyphs/402653239/uv_rect = Rect2(114, 124, 12, 14)\ncache/0/16/0/glyphs/402653239/texture_idx = 0\ncache/0/16/0/glyphs/402653187/advance = Vector2(4.15625, 16.0938)\ncache/0/16/0/glyphs/402653187/offset = Vector2(-1, -1)\ncache/0/16/0/glyphs/402653187/size = Vector2(2, 2)\ncache/0/16/0/glyphs/402653187/uv_rect = Rect2(13, 1, 2, 2)\ncache/0/16/0/glyphs/402653187/texture_idx = 0\ncache/0/16/0/glyphs/402653241/advance = Vector2(9.95313, 16.0938)\ncache/0/16/0/glyphs/402653241/offset = Vector2(-1, -13)\ncache/0/16/0/glyphs/402653241/size = Vector2(13, 14)\ncache/0/16/0/glyphs/402653241/uv_rect = Rect2(128, 124, 13, 14)\ncache/0/16/0/glyphs/402653241/texture_idx = 0\ncache/0/16/0/glyphs/134217757/advance = Vector2(4.40625, 16.0938)\ncache/0/16/0/glyphs/134217757/offset = Vector2(0, -10)\ncache/0/16/0/glyphs/134217757/size = Vector2(5, 11)\ncache/0/16/0/glyphs/134217757/uv_rect = Rect2(42, 111, 5, 11)\ncache/0/16/0/glyphs/134217757/texture_idx = 0\ncache/0/16/0/glyphs/402653244/advance = Vector2(9.46875, 16.0938)\ncache/0/16/0/glyphs/402653244/offset = Vector2(-1, -13)\ncache/0/16/0/glyphs/402653244/size = Vector2(13, 14)\ncache/0/16/0/glyphs/402653244/uv_rect = Rect2(143, 124, 13, 14)\ncache/0/16/0/glyphs/402653244/texture_idx = 0\ncache/0/16/0/glyphs/402653240/advance = Vector2(11.875, 16.0938)\ncache/0/16/0/glyphs/402653240/offset = Vector2(1, -13)\ncache/0/16/0/glyphs/402653240/size = Vector2(12, 14)\ncache/0/16/0/glyphs/402653240/uv_rect = Rect2(158, 124, 12, 14)\ncache/0/16/0/glyphs/402653240/texture_idx = 0\ncache/0/16/0/glyphs/134217810/advance = Vector2(9.78125, 16.0938)\ncache/0/16/0/glyphs/134217810/offset = Vector2(0, -10)\ncache/0/16/0/glyphs/134217810/size = Vector2(11, 11)\ncache/0/16/0/glyphs/134217810/uv_rect = Rect2(49, 111, 11, 11)\ncache/0/16/0/glyphs/134217810/texture_idx = 0\ncache/0/16/0/glyphs/134217798/advance = Vector2(7.92188, 16.0938)\ncache/0/16/0/glyphs/134217798/offset = Vector2(0, -10)\ncache/0/16/0/glyphs/134217798/size = Vector2(9, 11)\ncache/0/16/0/glyphs/134217798/uv_rect = Rect2(62, 111, 9, 11)\ncache/0/16/0/glyphs/134217798/texture_idx = 0\ncache/0/16/0/glyphs/268435527/advance = Vector2(9.96875, 16.0938)\ncache/0/16/0/glyphs/268435527/offset = Vector2(0, -13)\ncache/0/16/0/glyphs/268435527/size = Vector2(11, 14)\ncache/0/16/0/glyphs/268435527/uv_rect = Rect2(172, 124, 11, 14)\ncache/0/16/0/glyphs/268435527/texture_idx = 0\ncache/0/16/0/glyphs/268435485/advance = Vector2(4.40625, 16.0938)\ncache/0/16/0/glyphs/268435485/offset = Vector2(0, -10)\ncache/0/16/0/glyphs/268435485/size = Vector2(5, 11)\ncache/0/16/0/glyphs/268435485/uv_rect = Rect2(73, 111, 5, 11)\ncache/0/16/0/glyphs/268435485/texture_idx = 0\ncache/0/16/0/glyphs/402653270/advance = Vector2(7.79688, 16.0938)\ncache/0/16/0/glyphs/402653270/offset = Vector2(0, -10)\ncache/0/16/0/glyphs/402653270/size = Vector2(9, 11)\ncache/0/16/0/glyphs/402653270/uv_rect = Rect2(80, 111, 9, 11)\ncache/0/16/0/glyphs/402653270/texture_idx = 0\ncache/0/16/0/glyphs/268435534/advance = Vector2(9.15625, 16.0938)\ncache/0/16/0/glyphs/268435534/offset = Vector2(0, -13)\ncache/0/16/0/glyphs/268435534/size = Vector2(11, 14)\ncache/0/16/0/glyphs/268435534/uv_rect = Rect2(185, 124, 11, 14)\ncache/0/16/0/glyphs/268435534/texture_idx = 0\ncache/0/16/0/glyphs/402653255/advance = Vector2(9.96875, 16.0938)\ncache/0/16/0/glyphs/402653255/offset = Vector2(0, -13)\ncache/0/16/0/glyphs/402653255/size = Vector2(11, 14)\ncache/0/16/0/glyphs/402653255/uv_rect = Rect2(198, 124, 11, 14)\ncache/0/16/0/glyphs/402653255/texture_idx = 0\ncache/0/16/0/glyphs/268435524/advance = Vector2(9.28125, 16.0938)\ncache/0/16/0/glyphs/268435524/offset = Vector2(0, -10)\ncache/0/16/0/glyphs/268435524/size = Vector2(10, 11)\ncache/0/16/0/glyphs/268435524/uv_rect = Rect2(91, 111, 10, 11)\ncache/0/16/0/glyphs/268435524/texture_idx = 0\ncache/0/16/0/glyphs/402653264/advance = Vector2(15.2969, 16.0938)\ncache/0/16/0/glyphs/402653264/offset = Vector2(1, -10)\ncache/0/16/0/glyphs/402653264/size = Vector2(15, 11)\ncache/0/16/0/glyphs/402653264/uv_rect = Rect2(103, 111, 15, 11)\ncache/0/16/0/glyphs/402653264/texture_idx = 0\ncache/0/16/0/glyphs/134217806/advance = Vector2(9.15625, 16.0938)\ncache/0/16/0/glyphs/134217806/offset = Vector2(0, -13)\ncache/0/16/0/glyphs/134217806/size = Vector2(11, 14)\ncache/0/16/0/glyphs/134217806/uv_rect = Rect2(211, 124, 11, 14)\ncache/0/16/0/glyphs/134217806/texture_idx = 0\ncache/0/16/0/glyphs/402653233/advance = Vector2(12.5313, 16.0938)\ncache/0/16/0/glyphs/402653233/offset = Vector2(1, -13)\ncache/0/16/0/glyphs/402653233/size = Vector2(12, 14)\ncache/0/16/0/glyphs/402653233/uv_rect = Rect2(224, 124, 12, 14)\ncache/0/16/0/glyphs/402653233/texture_idx = 0\ncache/0/16/0/glyphs/268435536/advance = Vector2(15.2969, 16.0938)\ncache/0/16/0/glyphs/268435536/offset = Vector2(0, -10)\ncache/0/16/0/glyphs/268435536/size = Vector2(16, 11)\ncache/0/16/0/glyphs/268435536/uv_rect = Rect2(120, 111, 16, 11)\ncache/0/16/0/glyphs/268435536/texture_idx = 0\ncache/0/16/0/glyphs/134217728/advance = Vector2(0, 0)\ncache/0/16/0/glyphs/134217728/offset = Vector2(0, 0)\ncache/0/16/0/glyphs/134217728/size = Vector2(0, 0)\ncache/0/16/0/glyphs/134217728/uv_rect = Rect2(0, 0, 0, 0)\ncache/0/16/0/glyphs/134217728/texture_idx = -1\ncache/0/16/0/glyphs/134217781/advance = Vector2(10.2344, 16.0938)\ncache/0/16/0/glyphs/134217781/offset = Vector2(0, -13)\ncache/0/16/0/glyphs/134217781/size = Vector2(12, 14)\ncache/0/16/0/glyphs/134217781/uv_rect = Rect2(238, 124, 12, 14)\ncache/0/16/0/glyphs/134217781/texture_idx = 0\ncache/0/16/0/glyphs/268435492/advance = Vector2(10.5781, 16.0938)\ncache/0/16/0/glyphs/268435492/offset = Vector2(-1, -13)\ncache/0/16/0/glyphs/268435492/size = Vector2(14, 14)\ncache/0/16/0/glyphs/268435492/uv_rect = Rect2(1, 140, 14, 14)\ncache/0/16/0/glyphs/268435492/texture_idx = 0\ncache/0/16/0/glyphs/402653224/advance = Vector2(8.9375, 16.0938)\ncache/0/16/0/glyphs/402653224/offset = Vector2(1, -13)\ncache/0/16/0/glyphs/402653224/size = Vector2(9, 14)\ncache/0/16/0/glyphs/402653224/uv_rect = Rect2(17, 140, 9, 14)\ncache/0/16/0/glyphs/402653224/texture_idx = 0\ncache/0/16/0/glyphs/268435514/advance = Vector2(15.1406, 16.0938)\ncache/0/16/0/glyphs/268435514/offset = Vector2(-1, -13)\ncache/0/16/0/glyphs/268435514/size = Vector2(18, 14)\ncache/0/16/0/glyphs/268435514/uv_rect = Rect2(28, 140, 18, 14)\ncache/0/16/0/glyphs/268435514/texture_idx = 0\ncache/0/16/0/glyphs/268435506/advance = Vector2(12.5938, 16.0938)\ncache/0/16/0/glyphs/268435506/offset = Vector2(0, -13)\ncache/0/16/0/glyphs/268435506/size = Vector2(14, 14)\ncache/0/16/0/glyphs/268435506/uv_rect = Rect2(48, 140, 14, 14)\ncache/0/16/0/glyphs/268435506/texture_idx = 0\ncache/0/16/0/glyphs/134217765/advance = Vector2(10.5625, 16.0938)\ncache/0/16/0/glyphs/134217765/offset = Vector2(0, -13)\ncache/0/16/0/glyphs/134217765/size = Vector2(11, 14)\ncache/0/16/0/glyphs/134217765/uv_rect = Rect2(64, 140, 11, 14)\ncache/0/16/0/glyphs/134217765/texture_idx = 0\ncache/0/16/0/glyphs/402653221/advance = Vector2(10.5625, 16.0938)\ncache/0/16/0/glyphs/402653221/offset = Vector2(1, -13)\ncache/0/16/0/glyphs/402653221/size = Vector2(11, 14)\ncache/0/16/0/glyphs/402653221/uv_rect = Rect2(77, 140, 11, 14)\ncache/0/16/0/glyphs/402653221/texture_idx = 0\ncache/0/16/0/glyphs/134217788/advance = Vector2(9.46875, 16.0938)\ncache/0/16/0/glyphs/134217788/offset = Vector2(-1, -13)\ncache/0/16/0/glyphs/134217788/size = Vector2(12, 14)\ncache/0/16/0/glyphs/134217788/uv_rect = Rect2(90, 140, 12, 14)\ncache/0/16/0/glyphs/134217788/texture_idx = 0\ncache/0/16/0/glyphs/268435496/advance = Vector2(8.9375, 16.0938)\ncache/0/16/0/glyphs/268435496/offset = Vector2(1, -13)\ncache/0/16/0/glyphs/268435496/size = Vector2(9, 14)\ncache/0/16/0/glyphs/268435496/uv_rect = Rect2(104, 140, 9, 14)\ncache/0/16/0/glyphs/268435496/texture_idx = 0\ncache/0/16/0/glyphs/134217764/advance = Vector2(10.5781, 16.0938)\ncache/0/16/0/glyphs/134217764/offset = Vector2(-1, -13)\ncache/0/16/0/glyphs/134217764/size = Vector2(13, 14)\ncache/0/16/0/glyphs/134217764/uv_rect = Rect2(115, 140, 13, 14)\ncache/0/16/0/glyphs/134217764/texture_idx = 0\ncache/0/16/0/glyphs/402653231/advance = Vector2(8.67188, 16.0938)\ncache/0/16/0/glyphs/402653231/offset = Vector2(1, -13)\ncache/0/16/0/glyphs/402653231/size = Vector2(9, 14)\ncache/0/16/0/glyphs/402653231/uv_rect = Rect2(130, 140, 9, 14)\ncache/0/16/0/glyphs/402653231/texture_idx = 0\ncache/0/16/0/glyphs/402653243/advance = Vector2(9.95313, 16.0938)\ncache/0/16/0/glyphs/402653243/offset = Vector2(-1, -13)\ncache/0/16/0/glyphs/402653243/size = Vector2(13, 14)\ncache/0/16/0/glyphs/402653243/uv_rect = Rect2(141, 140, 13, 14)\ncache/0/16/0/glyphs/402653243/texture_idx = 0\ncache/0/16/0/glyphs/268435515/advance = Vector2(9.95313, 16.0938)\ncache/0/16/0/glyphs/268435515/offset = Vector2(-1, -13)\ncache/0/16/0/glyphs/268435515/size = Vector2(13, 14)\ncache/0/16/0/glyphs/268435515/uv_rect = Rect2(156, 140, 13, 14)\ncache/0/16/0/glyphs/268435515/texture_idx = 0\ncache/0/16/0/glyphs/402653269/advance = Vector2(6.90625, 16.0938)\ncache/0/16/0/glyphs/402653269/offset = Vector2(1, -10)\ncache/0/16/0/glyphs/402653269/size = Vector2(8, 11)\ncache/0/16/0/glyphs/402653269/uv_rect = Rect2(138, 111, 8, 11)\ncache/0/16/0/glyphs/402653269/texture_idx = 0\ncache/0/16/0/glyphs/402653276/advance = Vector2(8.57813, 16.0938)\ncache/0/16/0/glyphs/402653276/offset = Vector2(-1, -10)\ncache/0/16/0/glyphs/402653276/size = Vector2(12, 15)\ncache/0/16/0/glyphs/402653276/uv_rect = Rect2(1, 156, 12, 15)\ncache/0/16/0/glyphs/402653276/texture_idx = 0\ncache/0/16/0/glyphs/402653272/advance = Vector2(10.1563, 16.0938)\ncache/0/16/0/glyphs/402653272/offset = Vector2(0, -10)\ncache/0/16/0/glyphs/402653272/size = Vector2(11, 11)\ncache/0/16/0/glyphs/402653272/uv_rect = Rect2(148, 111, 11, 11)\ncache/0/16/0/glyphs/402653272/texture_idx = 0\ncache/0/16/0/glyphs/134217815/advance = Vector2(6.29688, 16.0938)\ncache/0/16/0/glyphs/134217815/offset = Vector2(-1, -12)\ncache/0/16/0/glyphs/134217815/size = Vector2(9, 13)\ncache/0/16/0/glyphs/134217815/uv_rect = Rect2(171, 140, 9, 13)\ncache/0/16/0/glyphs/134217815/texture_idx = 0\ncache/0/16/0/glyphs/402653234/advance = Vector2(12.5938, 16.0938)\ncache/0/16/0/glyphs/402653234/offset = Vector2(0, -13)\ncache/0/16/0/glyphs/402653234/size = Vector2(14, 14)\ncache/0/16/0/glyphs/402653234/uv_rect = Rect2(182, 140, 14, 14)\ncache/0/16/0/glyphs/402653234/texture_idx = 0\ncache/0/16/0/glyphs/268435507/advance = Vector2(9.84375, 16.0938)\ncache/0/16/0/glyphs/268435507/offset = Vector2(1, -13)\ncache/0/16/0/glyphs/268435507/size = Vector2(10, 14)\ncache/0/16/0/glyphs/268435507/uv_rect = Rect2(198, 140, 10, 14)\ncache/0/16/0/glyphs/268435507/texture_idx = 0\ncache/0/16/0/glyphs/134217784/advance = Vector2(11.875, 16.0938)\ncache/0/16/0/glyphs/134217784/offset = Vector2(0, -13)\ncache/0/16/0/glyphs/134217784/size = Vector2(12, 14)\ncache/0/16/0/glyphs/134217784/uv_rect = Rect2(210, 140, 12, 14)\ncache/0/16/0/glyphs/134217784/texture_idx = 0\ncache/0/16/0/glyphs/134217779/advance = Vector2(9.84375, 16.0938)\ncache/0/16/0/glyphs/134217779/offset = Vector2(0, -13)\ncache/0/16/0/glyphs/134217779/size = Vector2(11, 14)\ncache/0/16/0/glyphs/134217779/uv_rect = Rect2(224, 140, 11, 14)\ncache/0/16/0/glyphs/134217779/texture_idx = 0\ncache/0/16/0/glyphs/134217786/advance = Vector2(15.1406, 16.0938)\ncache/0/16/0/glyphs/134217786/offset = Vector2(-1, -13)\ncache/0/16/0/glyphs/134217786/size = Vector2(18, 14)\ncache/0/16/0/glyphs/134217786/uv_rect = Rect2(237, 140, 18, 14)\ncache/0/16/0/glyphs/134217786/texture_idx = 0\ncache/0/16/0/glyphs/134218646/advance = Vector2(4.89063, 16.0938)\ncache/0/16/0/glyphs/134218646/offset = Vector2(0, -13)\ncache/0/16/0/glyphs/134218646/size = Vector2(5, 14)\ncache/0/16/0/glyphs/134218646/uv_rect = Rect2(15, 156, 5, 14)\ncache/0/16/0/glyphs/134218646/texture_idx = 0\ncache/0/16/0/glyphs/134217777/advance = Vector2(12.5313, 16.0938)\ncache/0/16/0/glyphs/134217777/offset = Vector2(0, -13)\ncache/0/16/0/glyphs/134217777/size = Vector2(13, 14)\ncache/0/16/0/glyphs/134217777/uv_rect = Rect2(22, 156, 13, 14)\ncache/0/16/0/glyphs/134217777/texture_idx = 0\ncache/0/16/0/glyphs/402653223/advance = Vector2(11.75, 16.0938)\ncache/0/16/0/glyphs/402653223/offset = Vector2(1, -13)\ncache/0/16/0/glyphs/402653223/size = Vector2(12, 14)\ncache/0/16/0/glyphs/402653223/uv_rect = Rect2(37, 156, 12, 14)\ncache/0/16/0/glyphs/402653223/texture_idx = 0\ncache/0/16/0/glyphs/134217783/advance = Vector2(9.0625, 16.0938)\ncache/0/16/0/glyphs/134217783/offset = Vector2(-1, -13)\ncache/0/16/0/glyphs/134217783/size = Vector2(12, 14)\ncache/0/16/0/glyphs/134217783/uv_rect = Rect2(51, 156, 12, 14)\ncache/0/16/0/glyphs/134217783/texture_idx = 0\ncache/0/16/0/glyphs/268435516/advance = Vector2(9.46875, 16.0938)\ncache/0/16/0/glyphs/268435516/offset = Vector2(-1, -13)\ncache/0/16/0/glyphs/268435516/size = Vector2(12, 14)\ncache/0/16/0/glyphs/268435516/uv_rect = Rect2(65, 156, 12, 14)\ncache/0/16/0/glyphs/268435516/texture_idx = 0\ncache/0/16/0/glyphs/268436374/advance = Vector2(4.89063, 16.0938)\ncache/0/16/0/glyphs/268436374/offset = Vector2(1, -13)\ncache/0/16/0/glyphs/268436374/size = Vector2(4, 14)\ncache/0/16/0/glyphs/268436374/uv_rect = Rect2(79, 156, 4, 14)\ncache/0/16/0/glyphs/268436374/texture_idx = 0\ncache/0/16/0/glyphs/268435503/advance = Vector2(8.67188, 16.0938)\ncache/0/16/0/glyphs/268435503/offset = Vector2(1, -13)\ncache/0/16/0/glyphs/268435503/size = Vector2(9, 14)\ncache/0/16/0/glyphs/268435503/uv_rect = Rect2(85, 156, 9, 14)\ncache/0/16/0/glyphs/268435503/texture_idx = 0\ncache/0/16/0/glyphs/402653252/advance = Vector2(9.28125, 16.0938)\ncache/0/16/0/glyphs/402653252/offset = Vector2(0, -10)\ncache/0/16/0/glyphs/402653252/size = Vector2(10, 11)\ncache/0/16/0/glyphs/402653252/uv_rect = Rect2(161, 111, 10, 11)\ncache/0/16/0/glyphs/402653252/texture_idx = 0\ncache/0/16/0/glyphs/268435493/advance = Vector2(10.5625, 16.0938)\ncache/0/16/0/glyphs/268435493/offset = Vector2(1, -13)\ncache/0/16/0/glyphs/268435493/size = Vector2(11, 14)\ncache/0/16/0/glyphs/268435493/uv_rect = Rect2(96, 156, 11, 14)\ncache/0/16/0/glyphs/268435493/texture_idx = 0\ncache/0/16/0/glyphs/268435511/advance = Vector2(9.0625, 16.0938)\ncache/0/16/0/glyphs/268435511/offset = Vector2(-1, -13)\ncache/0/16/0/glyphs/268435511/size = Vector2(12, 14)\ncache/0/16/0/glyphs/268435511/uv_rect = Rect2(109, 156, 12, 14)\ncache/0/16/0/glyphs/268435511/texture_idx = 0\ncache/0/16/0/glyphs/134217802/advance = Vector2(8.90625, 16.0938)\ncache/0/16/0/glyphs/134217802/offset = Vector2(-1, -10)\ncache/0/16/0/glyphs/134217802/size = Vector2(11, 15)\ncache/0/16/0/glyphs/134217802/uv_rect = Rect2(123, 156, 11, 15)\ncache/0/16/0/glyphs/134217802/texture_idx = 0\ncache/0/16/0/glyphs/268435544/advance = Vector2(10.1563, 16.0938)\ncache/0/16/0/glyphs/268435544/offset = Vector2(0, -10)\ncache/0/16/0/glyphs/268435544/size = Vector2(11, 11)\ncache/0/16/0/glyphs/268435544/uv_rect = Rect2(173, 111, 11, 11)\ncache/0/16/0/glyphs/268435544/texture_idx = 0\ncache/0/16/0/glyphs/134217797/advance = Vector2(9.96875, 16.0938)\ncache/0/16/0/glyphs/134217797/offset = Vector2(0, -13)\ncache/0/16/0/glyphs/134217797/size = Vector2(11, 14)\ncache/0/16/0/glyphs/134217797/uv_rect = Rect2(136, 156, 11, 14)\ncache/0/16/0/glyphs/134217797/texture_idx = 0\ncache/0/16/0/glyphs/134217809/advance = Vector2(10.1563, 16.0938)\ncache/0/16/0/glyphs/134217809/offset = Vector2(0, -10)\ncache/0/16/0/glyphs/134217809/size = Vector2(11, 11)\ncache/0/16/0/glyphs/134217809/uv_rect = Rect2(186, 111, 11, 11)\ncache/0/16/0/glyphs/134217809/texture_idx = 0\ncache/0/16/0/glyphs/134217816/advance = Vector2(10.1563, 16.0938)\ncache/0/16/0/glyphs/134217816/offset = Vector2(0, -10)\ncache/0/16/0/glyphs/134217816/size = Vector2(11, 11)\ncache/0/16/0/glyphs/134217816/uv_rect = Rect2(199, 111, 11, 11)\ncache/0/16/0/glyphs/134217816/texture_idx = 0\ncache/0/16/0/glyphs/268435504/advance = Vector2(14.7656, 16.0938)\ncache/0/16/0/glyphs/268435504/offset = Vector2(1, -13)\ncache/0/16/0/glyphs/268435504/size = Vector2(14, 14)\ncache/0/16/0/glyphs/268435504/uv_rect = Rect2(149, 156, 14, 14)\ncache/0/16/0/glyphs/268435504/texture_idx = 0\ncache/0/16/0/glyphs/268435539/advance = Vector2(9.96875, 16.0938)\ncache/0/16/0/glyphs/268435539/offset = Vector2(0, -10)\ncache/0/16/0/glyphs/268435539/size = Vector2(11, 15)\ncache/0/16/0/glyphs/268435539/uv_rect = Rect2(165, 156, 11, 15)\ncache/0/16/0/glyphs/268435539/texture_idx = 0\ncache/0/16/0/glyphs/134217819/advance = Vector2(8.8125, 16.0938)\ncache/0/16/0/glyphs/134217819/offset = Vector2(-1, -10)\ncache/0/16/0/glyphs/134217819/size = Vector2(11, 11)\ncache/0/16/0/glyphs/134217819/uv_rect = Rect2(212, 111, 11, 11)\ncache/0/16/0/glyphs/134217819/texture_idx = 0\ncache/0/16/0/glyphs/134217804/advance = Vector2(4.46875, 16.0938)\ncache/0/16/0/glyphs/134217804/offset = Vector2(0, -13)\ncache/0/16/0/glyphs/134217804/size = Vector2(5, 14)\ncache/0/16/0/glyphs/134217804/uv_rect = Rect2(178, 156, 5, 14)\ncache/0/16/0/glyphs/134217804/texture_idx = 0\ncache/0/16/0/glyphs/134217747/advance = Vector2(9.14063, 16.0938)\ncache/0/16/0/glyphs/134217747/offset = Vector2(-1, -13)\ncache/0/16/0/glyphs/134217747/size = Vector2(11, 14)\ncache/0/16/0/glyphs/134217747/uv_rect = Rect2(185, 156, 11, 14)\ncache/0/16/0/glyphs/134217747/texture_idx = 0\ncache/0/16/0/glyphs/134217736/advance = Vector2(13.7969, 16.0938)\ncache/0/16/0/glyphs/134217736/offset = Vector2(-1, -13)\ncache/0/16/0/glyphs/134217736/size = Vector2(16, 14)\ncache/0/16/0/glyphs/134217736/uv_rect = Rect2(198, 156, 16, 14)\ncache/0/16/0/glyphs/134217736/texture_idx = 0\ncache/0/16/0/glyphs/268435477/advance = Vector2(9.14063, 16.0938)\ncache/0/16/0/glyphs/268435477/offset = Vector2(0, -13)\ncache/0/16/0/glyphs/268435477/size = Vector2(10, 14)\ncache/0/16/0/glyphs/268435477/uv_rect = Rect2(216, 156, 10, 14)\ncache/0/16/0/glyphs/268435477/texture_idx = 0\ncache/0/16/0/glyphs/268435478/advance = Vector2(9.14063, 16.0938)\ncache/0/16/0/glyphs/268435478/offset = Vector2(0, -13)\ncache/0/16/0/glyphs/268435478/size = Vector2(10, 14)\ncache/0/16/0/glyphs/268435478/uv_rect = Rect2(228, 156, 10, 14)\ncache/0/16/0/glyphs/268435478/texture_idx = 0\ncache/0/16/0/glyphs/402654102/advance = Vector2(4.89063, 16.0938)\ncache/0/16/0/glyphs/402654102/offset = Vector2(1, -13)\ncache/0/16/0/glyphs/402654102/size = Vector2(5, 14)\ncache/0/16/0/glyphs/402654102/uv_rect = Rect2(240, 156, 5, 14)\ncache/0/16/0/glyphs/402654102/texture_idx = 0\ncache/0/16/0/glyphs/402653258/advance = Vector2(8.90625, 16.0938)\ncache/0/16/0/glyphs/402653258/offset = Vector2(-1, -10)\ncache/0/16/0/glyphs/402653258/size = Vector2(12, 15)\ncache/0/16/0/glyphs/402653258/uv_rect = Rect2(1, 173, 12, 15)\ncache/0/16/0/glyphs/402653258/texture_idx = 0\ncache/0/16/0/glyphs/402653263/advance = Vector2(4.46875, 16.0938)\ncache/0/16/0/glyphs/402653263/offset = Vector2(1, -13)\ncache/0/16/0/glyphs/402653263/size = Vector2(4, 14)\ncache/0/16/0/glyphs/402653263/uv_rect = Rect2(247, 156, 4, 14)\ncache/0/16/0/glyphs/402653263/texture_idx = 0\ncache/0/16/0/glyphs/268435495/advance = Vector2(11.75, 16.0938)\ncache/0/16/0/glyphs/268435495/offset = Vector2(1, -13)\ncache/0/16/0/glyphs/268435495/size = Vector2(12, 14)\ncache/0/16/0/glyphs/268435495/uv_rect = Rect2(15, 173, 12, 14)\ncache/0/16/0/glyphs/268435495/texture_idx = 0\ncache/0/16/0/glyphs/402653253/advance = Vector2(9.96875, 16.0938)\ncache/0/16/0/glyphs/402653253/offset = Vector2(1, -13)\ncache/0/16/0/glyphs/402653253/size = Vector2(10, 14)\ncache/0/16/0/glyphs/402653253/uv_rect = Rect2(29, 173, 10, 14)\ncache/0/16/0/glyphs/402653253/texture_idx = 0\ncache/0/16/0/glyphs/134217767/advance = Vector2(11.75, 16.0938)\ncache/0/16/0/glyphs/134217767/offset = Vector2(0, -13)\ncache/0/16/0/glyphs/134217767/size = Vector2(13, 14)\ncache/0/16/0/glyphs/134217767/uv_rect = Rect2(41, 173, 13, 14)\ncache/0/16/0/glyphs/134217767/texture_idx = 0\ncache/0/16/0/glyphs/134217745/advance = Vector2(4.40625, 16.0938)\ncache/0/16/0/glyphs/134217745/offset = Vector2(0, -4)\ncache/0/16/0/glyphs/134217745/size = Vector2(5, 5)\ncache/0/16/0/glyphs/134217745/uv_rect = Rect2(225, 111, 5, 5)\ncache/0/16/0/glyphs/134217745/texture_idx = 0\ncache/0/16/0/glyphs/268435473/advance = Vector2(4.40625, 16.0938)\ncache/0/16/0/glyphs/268435473/offset = Vector2(0, -4)\ncache/0/16/0/glyphs/268435473/size = Vector2(5, 5)\ncache/0/16/0/glyphs/268435473/uv_rect = Rect2(232, 111, 5, 5)\ncache/0/16/0/glyphs/268435473/texture_idx = 0\ncache/0/16/0/glyphs/402653201/advance = Vector2(4.40625, 16.0938)\ncache/0/16/0/glyphs/402653201/offset = Vector2(0, -4)\ncache/0/16/0/glyphs/402653201/size = Vector2(6, 5)\ncache/0/16/0/glyphs/402653201/uv_rect = Rect2(239, 111, 6, 5)\ncache/0/16/0/glyphs/402653201/texture_idx = 0\ncache/0/16/0/glyphs/34/advance = Vector2(7.25, 16.0938)\ncache/0/16/0/glyphs/34/offset = Vector2(-1, -13)\ncache/0/16/0/glyphs/34/size = Vector2(9, 14)\ncache/0/16/0/glyphs/34/uv_rect = Rect2(56, 173, 9, 14)\ncache/0/16/0/glyphs/34/texture_idx = 0\ncache/0/16/0/kerning_overrides/16/0 = Vector2(0, 0)\ncache/0/16/0/kerning_overrides/20/0 = Vector2(0, 0)\ncache/0/20/0/ascent = 22.0\ncache/0/20/0/descent = 6.0\ncache/0/20/0/underline_position = 2.0\ncache/0/20/0/underline_thickness = 1.0\ncache/0/20/0/scale = 1.0\ncache/0/20/0/textures/0/offsets = PackedInt32Array(193, 0, 63, 18, 15, 18, 241, 19)\ncache/0/20/0/textures/0/image = SubResource(\"Image_vwwu5\")\ncache/0/20/0/glyphs/39/advance = Vector2(14.6719, 20.1094)\ncache/0/20/0/glyphs/39/offset = Vector2(0, -15)\ncache/0/20/0/glyphs/39/size = Vector2(15, 16)\ncache/0/20/0/glyphs/39/uv_rect = Rect2(1, 1, 15, 16)\ncache/0/20/0/glyphs/39/texture_idx = 0\ncache/0/20/0/glyphs/76/advance = Vector2(5.57813, 20.1094)\ncache/0/20/0/glyphs/76/offset = Vector2(0, -16)\ncache/0/20/0/glyphs/76/size = Vector2(6, 17)\ncache/0/20/0/glyphs/76/uv_rect = Rect2(1, 19, 6, 17)\ncache/0/20/0/glyphs/76/texture_idx = 0\ncache/0/20/0/glyphs/85/advance = Vector2(8.625, 20.1094)\ncache/0/20/0/glyphs/85/offset = Vector2(0, -12)\ncache/0/20/0/glyphs/85/size = Vector2(10, 13)\ncache/0/20/0/glyphs/85/uv_rect = Rect2(18, 1, 10, 13)\ncache/0/20/0/glyphs/85/texture_idx = 0\ncache/0/20/0/glyphs/72/advance = Vector2(11.5313, 20.1094)\ncache/0/20/0/glyphs/72/offset = Vector2(0, -12)\ncache/0/20/0/glyphs/72/size = Vector2(12, 13)\ncache/0/20/0/glyphs/72/uv_rect = Rect2(30, 1, 12, 13)\ncache/0/20/0/glyphs/72/texture_idx = 0\ncache/0/20/0/glyphs/70/advance = Vector2(9.90625, 20.1094)\ncache/0/20/0/glyphs/70/offset = Vector2(0, -12)\ncache/0/20/0/glyphs/70/size = Vector2(11, 13)\ncache/0/20/0/glyphs/70/uv_rect = Rect2(44, 1, 11, 13)\ncache/0/20/0/glyphs/70/texture_idx = 0\ncache/0/20/0/glyphs/87/advance = Vector2(7.85938, 20.1094)\ncache/0/20/0/glyphs/87/offset = Vector2(-1, -15)\ncache/0/20/0/glyphs/87/size = Vector2(10, 16)\ncache/0/20/0/glyphs/87/uv_rect = Rect2(57, 1, 10, 16)\ncache/0/20/0/glyphs/87/texture_idx = 0\ncache/0/20/0/glyphs/82/advance = Vector2(12.2188, 20.1094)\ncache/0/20/0/glyphs/82/offset = Vector2(0, -12)\ncache/0/20/0/glyphs/82/size = Vector2(13, 13)\ncache/0/20/0/glyphs/82/uv_rect = Rect2(69, 1, 13, 13)\ncache/0/20/0/glyphs/82/texture_idx = 0\ncache/0/20/0/glyphs/86/advance = Vector2(9.73438, 20.1094)\ncache/0/20/0/glyphs/86/offset = Vector2(-1, -12)\ncache/0/20/0/glyphs/86/size = Vector2(11, 13)\ncache/0/20/0/glyphs/86/uv_rect = Rect2(84, 1, 11, 13)\ncache/0/20/0/glyphs/86/texture_idx = 0\ncache/0/20/0/glyphs/3/advance = Vector2(5.20313, 20.1094)\ncache/0/20/0/glyphs/3/offset = Vector2(-1, -1)\ncache/0/20/0/glyphs/3/size = Vector2(2, 2)\ncache/0/20/0/glyphs/3/uv_rect = Rect2(97, 1, 2, 2)\ncache/0/20/0/glyphs/3/texture_idx = 0\ncache/0/20/0/glyphs/9/advance = Vector2(14.8125, 20.1094)\ncache/0/20/0/glyphs/9/offset = Vector2(-1, -15)\ncache/0/20/0/glyphs/9/size = Vector2(17, 16)\ncache/0/20/0/glyphs/9/uv_rect = Rect2(101, 1, 17, 16)\ncache/0/20/0/glyphs/9/texture_idx = 0\ncache/0/20/0/glyphs/41/advance = Vector2(10.6406, 20.1094)\ncache/0/20/0/glyphs/41/offset = Vector2(0, -15)\ncache/0/20/0/glyphs/41/size = Vector2(11, 16)\ncache/0/20/0/glyphs/41/uv_rect = Rect2(120, 1, 11, 16)\ncache/0/20/0/glyphs/41/texture_idx = 0\ncache/0/20/0/glyphs/79/advance = Vector2(5.57813, 20.1094)\ncache/0/20/0/glyphs/79/offset = Vector2(0, -16)\ncache/0/20/0/glyphs/79/size = Vector2(5, 17)\ncache/0/20/0/glyphs/79/uv_rect = Rect2(9, 19, 5, 17)\ncache/0/20/0/glyphs/79/texture_idx = 0\ncache/0/20/0/glyphs/29/advance = Vector2(5.5, 20.1094)\ncache/0/20/0/glyphs/29/offset = Vector2(0, -12)\ncache/0/20/0/glyphs/29/size = Vector2(6, 13)\ncache/0/20/0/glyphs/29/uv_rect = Rect2(133, 1, 6, 13)\ncache/0/20/0/glyphs/29/texture_idx = 0\ncache/0/20/0/glyphs/49/advance = Vector2(15.6719, 20.1094)\ncache/0/20/0/glyphs/49/offset = Vector2(0, -15)\ncache/0/20/0/glyphs/49/size = Vector2(15, 16)\ncache/0/20/0/glyphs/49/uv_rect = Rect2(141, 1, 15, 16)\ncache/0/20/0/glyphs/49/texture_idx = 0\ncache/0/20/0/glyphs/68/advance = Vector2(11.6094, 20.1094)\ncache/0/20/0/glyphs/68/offset = Vector2(-1, -12)\ncache/0/20/0/glyphs/68/size = Vector2(13, 13)\ncache/0/20/0/glyphs/68/uv_rect = Rect2(158, 1, 13, 13)\ncache/0/20/0/glyphs/68/texture_idx = 0\ncache/0/20/0/glyphs/80/advance = Vector2(19.125, 20.1094)\ncache/0/20/0/glyphs/80/offset = Vector2(0, -12)\ncache/0/20/0/glyphs/80/size = Vector2(19, 13)\ncache/0/20/0/glyphs/80/uv_rect = Rect2(173, 1, 19, 13)\ncache/0/20/0/glyphs/80/texture_idx = 0\ncache/0/20/0/kerning_overrides/16/0 = Vector2(0, 0)\ncache/0/20/0/kerning_overrides/20/0 = Vector2(0, 0)\n\n[sub_resource type=\"Image\" id=\"Image_l4aks\"]\ndata = {\n\"data\": PackedByteArray(\"////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////YP///2H///8A////AP///wD///8A////AP///wD///8A////AP///2D///9h////AP///wD///8A////YP///7////+/////Yf///wD///8A////AP///wD///8A////AP///2D///+/////v////2H///8A////AP///2H///+/////v////7////9h////AP///wD///8A////AP///2D///+/////v////7////9g////AP///wD///8A////Yf///7////+/////v////2H///8A////AP///2D///+/////v////7////9g////AP///wD///8A////AP///wD///9h////v////7////+/////Yf///2D///+/////v////7////9g////AP///wD///8A////AP///wD///8A////AP///2H///+/////v////7////+/////v////7////9g////AP///wD///8A////AP///wD///8A////AP///wD///8A////Yf///7////+/////v////7////9g////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///2D///+/////v////7////+/////Yf///wD///8A////AP///wD///8A////AP///wD///8A////AP///2D///+/////v////7////+/////v////7////9h////AP///wD///8A////AP///wD///8A////AP///2D///+/////v////7r///85////jv///7////+/////v////2H///8A////AP///wD///8A////AP///2D///+/////v////73///86////AP///wb///+F////v////7////+/////Yf///wD///8A////AP///2D///+/////v////77///9E////AP///wD///8A////BP///3z///+/////v////7////9h////AP///wD///9h////v////7////9O////AP///wD///8A////AP///wD///8C////cf///7////+/////YP///wD///8A////AP///2H///9a////AP///wD///8A////AP///wD///8A////AP///wH///9m////YP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AA==\"),\n\"format\": \"RGBA8\",\n\"height\": 16,\n\"mipmaps\": false,\n\"width\": 16\n}\n\n[sub_resource type=\"ImageTexture\" id=\"ImageTexture_3k56q\"]\nimage = SubResource(\"Image_l4aks\")\n\n[sub_resource type=\"StyleBoxFlat\" id=\"StyleBoxFlat_ea04u\"]\ncontent_margin_left = 4.0\ncontent_margin_top = 4.0\ncontent_margin_right = 4.0\ncontent_margin_bottom = 4.0\nbg_color = Color(1, 1, 1, 0.75)\ndraw_center = false\nborder_width_left = 2\nborder_width_top = 2\nborder_width_right = 2\nborder_width_bottom = 2\ncorner_radius_top_left = 3\ncorner_radius_top_right = 3\ncorner_radius_bottom_right = 3\ncorner_radius_bottom_left = 3\ncorner_detail = 5\nexpand_margin_left = 2.0\nexpand_margin_top = 2.0\nexpand_margin_right = 2.0\nexpand_margin_bottom = 2.0\n\n[sub_resource type=\"StyleBoxFlat\" id=\"StyleBoxFlat_v4mmb\"]\ncontent_margin_left = 8.0\ncontent_margin_top = 6.0\ncontent_margin_right = 6.0\ncontent_margin_bottom = 6.0\nbg_color = Color(0.101961, 0.101961, 0.101961, 1)\nborder_width_left = 2\nborder_width_top = 2\nborder_width_right = 2\nborder_width_bottom = 2\nborder_color = Color(0.188235, 0.188235, 0.188235, 1)\ncorner_radius_top_left = 3\ncorner_radius_top_right = 3\ncorner_radius_bottom_right = 3\ncorner_radius_bottom_left = 3\ncorner_detail = 5\n\n[sub_resource type=\"StyleBoxFlat\" id=\"StyleBoxFlat_ncfsv\"]\ncontent_margin_left = 4.0\ncontent_margin_top = 4.0\ncontent_margin_right = 4.0\ncontent_margin_bottom = 4.0\nbg_color = Color(0.1, 0.1, 0.1, 0.3)\nborder_width_bottom = 2\nborder_color = Color(0, 0, 0, 0.3)\ncorner_radius_top_left = 3\ncorner_radius_top_right = 3\ncorner_radius_bottom_right = 3\ncorner_radius_bottom_left = 3\ncorner_detail = 5\n\n[sub_resource type=\"Image\" id=\"Image_flcqm\"]\ndata = {\n\"data\": PackedByteArray(\"////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////ALOzs6OysrKmuLi4Ev///wD///8A////AP///wC4uLgSsrKyprKysqb///8A////ALGxsa2ysrLZsbGxs7i4uBL///8A////ALi4uBKysrKzsrKy2bKysqz///8A////AK+vrxOysrK1srKy2bGxsbO4uLgSuLi4ErKysrOysrLZs7OztK+vrxP///8A////AP///wCvr68TsrKytbKystmxsbGzsrKys7Kystmzs7O0r6+vE////wD///8A////AP///wD///8Ar6+vE7KysrWysrLZsrKy2bOzs7Svr68T////AP///wD///8A////AP///wD///8A////AK+vrxOysrKpsrKyqK+vrxP///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A\"),\n\"format\": \"RGBA8\",\n\"height\": 12,\n\"mipmaps\": false,\n\"width\": 12\n}\n\n[sub_resource type=\"ImageTexture\" id=\"ImageTexture_oehfs\"]\nimage = SubResource(\"Image_flcqm\")\n\n[sub_resource type=\"StyleBoxFlat\" id=\"StyleBoxFlat_qts61\"]\ncontent_margin_left = 8.0\ncontent_margin_top = 4.0\ncontent_margin_right = 21.0\ncontent_margin_bottom = 4.0\nbg_color = Color(0.1, 0.1, 0.1, 0.3)\ncorner_radius_top_left = 3\ncorner_radius_top_right = 3\ncorner_radius_bottom_right = 3\ncorner_radius_bottom_left = 3\ncorner_detail = 5\n\n[sub_resource type=\"StyleBoxFlat\" id=\"StyleBoxFlat_hv865\"]\ncontent_margin_left = 21.0\ncontent_margin_top = 4.0\ncontent_margin_right = 8.0\ncontent_margin_bottom = 4.0\nbg_color = Color(0.1, 0.1, 0.1, 0.3)\ncorner_radius_top_left = 3\ncorner_radius_top_right = 3\ncorner_radius_bottom_right = 3\ncorner_radius_bottom_left = 3\ncorner_detail = 5\n\n[sub_resource type=\"StyleBoxFlat\" id=\"StyleBoxFlat_1scso\"]\ncontent_margin_left = 8.0\ncontent_margin_top = 4.0\ncontent_margin_right = 21.0\ncontent_margin_bottom = 4.0\nbg_color = Color(0.225, 0.225, 0.225, 0.6)\ncorner_radius_top_left = 3\ncorner_radius_top_right = 3\ncorner_radius_bottom_right = 3\ncorner_radius_bottom_left = 3\ncorner_detail = 5\n\n[sub_resource type=\"StyleBoxFlat\" id=\"StyleBoxFlat_kx431\"]\ncontent_margin_left = 21.0\ncontent_margin_top = 4.0\ncontent_margin_right = 8.0\ncontent_margin_bottom = 4.0\nbg_color = Color(0.225, 0.225, 0.225, 0.6)\ncorner_radius_top_left = 3\ncorner_radius_top_right = 3\ncorner_radius_bottom_right = 3\ncorner_radius_bottom_left = 3\ncorner_detail = 5\n\n[sub_resource type=\"StyleBoxFlat\" id=\"StyleBoxFlat_4fm5o\"]\ncontent_margin_left = 8.0\ncontent_margin_top = 4.0\ncontent_margin_right = 21.0\ncontent_margin_bottom = 4.0\nbg_color = Color(0.1, 0.1, 0.1, 0.6)\ncorner_radius_top_left = 3\ncorner_radius_top_right = 3\ncorner_radius_bottom_right = 3\ncorner_radius_bottom_left = 3\ncorner_detail = 5\n\n[sub_resource type=\"StyleBoxFlat\" id=\"StyleBoxFlat_lo50j\"]\ncontent_margin_left = 21.0\ncontent_margin_top = 4.0\ncontent_margin_right = 8.0\ncontent_margin_bottom = 4.0\nbg_color = Color(0.1, 0.1, 0.1, 0.6)\ncorner_radius_top_left = 3\ncorner_radius_top_right = 3\ncorner_radius_bottom_right = 3\ncorner_radius_bottom_left = 3\ncorner_detail = 5\n\n[sub_resource type=\"StyleBoxFlat\" id=\"StyleBoxFlat_ss0gg\"]\ncontent_margin_left = 8.0\ncontent_margin_top = 4.0\ncontent_margin_right = 21.0\ncontent_margin_bottom = 4.0\nbg_color = Color(0, 0, 0, 0.6)\ncorner_radius_top_left = 3\ncorner_radius_top_right = 3\ncorner_radius_bottom_right = 3\ncorner_radius_bottom_left = 3\ncorner_detail = 5\n\n[sub_resource type=\"StyleBoxFlat\" id=\"StyleBoxFlat_6fha2\"]\ncontent_margin_left = 21.0\ncontent_margin_top = 4.0\ncontent_margin_right = 8.0\ncontent_margin_bottom = 4.0\nbg_color = Color(0, 0, 0, 0.6)\ncorner_radius_top_left = 3\ncorner_radius_top_right = 3\ncorner_radius_bottom_right = 3\ncorner_radius_bottom_left = 3\ncorner_detail = 5\n\n[sub_resource type=\"StyleBoxFlat\" id=\"StyleBoxFlat_6tiuh\"]\ncontent_margin_left = 2.0\ncontent_margin_top = 2.0\ncontent_margin_right = 2.0\ncontent_margin_bottom = 6.0\nbg_color = Color(0.054902, 0.054902, 0.054902, 1)\nborder_width_bottom = 4\nborder_color = Color(0.192157, 0.192157, 0.192157, 1)\n\n[sub_resource type=\"StyleBoxFlat\" id=\"StyleBoxFlat_dgqpj\"]\nbg_color = Color(0, 0, 0, 1)\nborder_width_left = 4\nborder_width_top = 4\nborder_width_right = 4\nborder_width_bottom = 4\nborder_color = Color(0.192157, 0.192157, 0.192157, 1)\ncorner_radius_top_left = 3\ncorner_radius_top_right = 3\ncorner_radius_bottom_right = 3\ncorner_radius_bottom_left = 3\ncorner_detail = 5\n\n[resource]\ndefault_font = ExtResource(\"5_kvsd8\")\ndefault_font_size = 16\nCheckBox/icons/checked = ExtResource(\"1_q2c85\")\nCheckBox/icons/checked_disabled = ExtResource(\"2_s6mpo\")\nCheckBox/icons/unchecked = ExtResource(\"3_gg3vm\")\nCheckBox/icons/unchecked_disabled = ExtResource(\"4_s07s3\")\nLineEdit/colors/caret_color = Color(0.95, 0.95, 0.95, 1)\nLineEdit/colors/clear_button_color = Color(0.875, 0.875, 0.875, 1)\nLineEdit/colors/clear_button_color_pressed = Color(1, 1, 1, 1)\nLineEdit/colors/font_color = Color(0.875, 0.875, 0.875, 1)\nLineEdit/colors/font_outline_color = Color(1, 1, 1, 1)\nLineEdit/colors/font_placeholder_color = Color(0.875, 0.875, 0.875, 0.6)\nLineEdit/colors/font_selected_color = Color(1, 1, 1, 1)\nLineEdit/colors/font_uneditable_color = Color(0.875, 0.875, 0.875, 0.5)\nLineEdit/colors/selection_color = Color(0.5, 0.5, 0.5, 1)\nLineEdit/constants/caret_width = 1\nLineEdit/constants/minimum_character_width = 4\nLineEdit/constants/outline_size = 0\nLineEdit/font_sizes/font_size = 16\nLineEdit/fonts/font = SubResource(\"FontFile_5froe\")\nLineEdit/icons/clear = SubResource(\"ImageTexture_3k56q\")\nLineEdit/styles/focus = SubResource(\"StyleBoxFlat_ea04u\")\nLineEdit/styles/normal = SubResource(\"StyleBoxFlat_v4mmb\")\nLineEdit/styles/read_only = SubResource(\"StyleBoxFlat_ncfsv\")\nOptionButton/colors/font_color = Color(0.875, 0.875, 0.875, 1)\nOptionButton/colors/font_disabled_color = Color(0.875, 0.875, 0.875, 0.5)\nOptionButton/colors/font_focus_color = Color(0.95, 0.95, 0.95, 1)\nOptionButton/colors/font_hover_color = Color(0.95, 0.95, 0.95, 1)\nOptionButton/colors/font_hover_pressed_color = Color(1, 1, 1, 1)\nOptionButton/colors/font_outline_color = Color(1, 1, 1, 1)\nOptionButton/colors/font_pressed_color = Color(1, 1, 1, 1)\nOptionButton/constants/arrow_margin = 4\nOptionButton/constants/h_separation = 2\nOptionButton/constants/modulate_arrow = 0\nOptionButton/constants/outline_size = 0\nOptionButton/font_sizes/font_size = 16\nOptionButton/fonts/font = SubResource(\"FontFile_5froe\")\nOptionButton/icons/arrow = SubResource(\"ImageTexture_oehfs\")\nOptionButton/styles/disabled = SubResource(\"StyleBoxFlat_qts61\")\nOptionButton/styles/disabled_mirrored = SubResource(\"StyleBoxFlat_hv865\")\nOptionButton/styles/focus = SubResource(\"StyleBoxFlat_ea04u\")\nOptionButton/styles/hover = SubResource(\"StyleBoxFlat_1scso\")\nOptionButton/styles/hover_mirrored = SubResource(\"StyleBoxFlat_kx431\")\nOptionButton/styles/normal = SubResource(\"StyleBoxFlat_4fm5o\")\nOptionButton/styles/normal_mirrored = SubResource(\"StyleBoxFlat_lo50j\")\nOptionButton/styles/pressed = SubResource(\"StyleBoxFlat_ss0gg\")\nOptionButton/styles/pressed_mirrored = SubResource(\"StyleBoxFlat_6fha2\")\nPanel_TitleBar/styles/panel = SubResource(\"StyleBoxFlat_6tiuh\")\nPopupPanel/styles/panel = SubResource(\"StyleBoxFlat_dgqpj\")\n"
  },
  {
    "path": "sample/dedicated_server_example/client_main.gd",
    "content": "extends Control\n\n@onready var PRODUCT_NAME: String = Env.get_var(\"PRODUCT_NAME\")\n@onready var PRODUCT_VERSION: String = Env.get_var(\"PRODUCT_VERSION\")\n@onready var PRODUCT_ID: String = Env.get_var(\"PRODUCT_ID\")\n@onready var SANDBOX_ID: String = Env.get_var(\"SANDBOX_ID\")\n@onready var DEPLOYMENT_ID: String = Env.get_var(\"DEPLOYMENT_ID\")\n@onready var ENCRYPTION_KEY: String = Env.get_var(\"ENCRYPTION_KEY\")\n\n@onready var CLIENT_ID: String = Env.get_var(\"CLIENT_ID\")\n@onready var CLIENT_SECRET: String = Env.get_var(\"CLIENT_SECRET\")\n\nfunc _log(msg: String):\n\tprint_rich(\"[color=WEB_GREEN]Client \" + HAuth.product_user_id + \": \" + msg + \"[/color]\")\n\n\nfunc _ready() -> void:\n\tvar credentials = HCredentials.new()\n\tcredentials.product_name = PRODUCT_NAME\n\tcredentials.product_version = PRODUCT_VERSION\n\tcredentials.product_id = PRODUCT_ID\n\tcredentials.sandbox_id = SANDBOX_ID\n\tcredentials.deployment_id = DEPLOYMENT_ID\n\tcredentials.client_id = CLIENT_ID\n\tcredentials.client_secret = CLIENT_SECRET\n\tcredentials.encryption_key = ENCRYPTION_KEY\n\t\n\t_log(\"Setting up EOS for dedicated client...\")\n\tvar setup_success := await HPlatform.setup_eos_async(credentials)\n\tif not setup_success:\n\t\t_log(\"Failed to setup EOS. See logs for error details\")\n\t\treturn\n\t\n\tvar args = OS.get_cmdline_user_args()\n\tfor arg in args:\n\t\tif arg.begins_with(\"--devuser=\"):\n\t\t\tvar username = arg.replace(\"--devuser=\", \"\")\n\t\t\t_login_as_client(username)\n\n\nfunc _login_as_client(devusername: String):\n\t_log(\"Logging in as client... %s\" % devusername)\n\tvar success := await HAuth.login_devtool_async(\"localhost:4545\", devusername)\n\tif not success:\n\t\treturn\n\t\n\t_log(\"Client logged in\")\n\t\n\t# Wait so that the server has time to create the session\n\t# This is just for the sample project!\n\t# In the real game this timer isnt needed\n\tawait get_tree().create_timer(5).timeout\n\t\n\tvar sessions = await HSessions.search_by_attribute_async({key = \"level\", value = \"margao\"})\n\tif not sessions:\n\t\treturn\n\t\n\tvar session_details = sessions[-1]\n\tvar session_info = session_details.copy_info().info\n\t_log(\"Joining session: %s\" % session_info)\n\t\n\t#HLog.log_level = HLog.LogLevel.DEBUG\n\t\n\t# Join the session\n\tvar join_success := await HSessions.join_async(session_details, \"Party\")\n\tif not join_success:\n\t\treturn\n\n\tvar peer = ENetMultiplayerPeer.new()\n\tvar addr_parts = session_info.host_address.split(\":\")\n\tvar ip = addr_parts[0]\n\tvar port = int(addr_parts[1])\n\tpeer.create_client(ip, port)\n\tmultiplayer.multiplayer_peer = peer\n\t\n\tawait multiplayer.connected_to_server\n\tc_s_register_player.rpc_id(0, HAuth.product_user_id)\n\n\t\n@rpc(\"any_peer\", \"reliable\")\nfunc c_s_register_player(puid: String):\n\tpass\n\n\n@rpc(\"reliable\")\nfunc s_c_register_player_completed(is_success: bool):\n\t_log(\"Got register player completed response from server: register_success=%s\" % str(is_success))\n"
  },
  {
    "path": "sample/dedicated_server_example/client_main.gd.uid",
    "content": "uid://3nyw0hwkkgmg\n"
  },
  {
    "path": "sample/dedicated_server_example/client_main.tscn",
    "content": "[gd_scene load_steps=2 format=3 uid=\"uid://dve4hhbpclrm5\"]\n\n[ext_resource type=\"Script\" uid=\"uid://3nyw0hwkkgmg\" path=\"res://dedicated_server_example/client_main.gd\" id=\"1_t6poi\"]\n\n[node name=\"Root\" type=\"Control\"]\nlayout_mode = 3\nanchors_preset = 15\nanchor_right = 1.0\nanchor_bottom = 1.0\ngrow_horizontal = 2\ngrow_vertical = 2\nmouse_filter = 2\nscript = ExtResource(\"1_t6poi\")\n"
  },
  {
    "path": "sample/dedicated_server_example/server_main.gd",
    "content": "extends Control\n\n\n@onready var PRODUCT_NAME: String = Env.get_var(\"PRODUCT_NAME\")\n@onready var PRODUCT_VERSION: String = Env.get_var(\"PRODUCT_VERSION\")\n@onready var PRODUCT_ID: String = Env.get_var(\"PRODUCT_ID\")\n@onready var SANDBOX_ID: String = Env.get_var(\"SANDBOX_ID\")\n@onready var DEPLOYMENT_ID: String = Env.get_var(\"DEPLOYMENT_ID\")\n@onready var ENCRYPTION_KEY: String = Env.get_var(\"ENCRYPTION_KEY\")\n\n@onready var SERVER_CLIENT_ID: String = Env.get_var(\"SERVER_CLIENT_ID\")\n@onready var SERVER_CLIENT_SECRET: String = Env.get_var(\"SERVER_CLIENT_SECRET\")\n\n\nconst PORT = 5412\nvar peer = ENetMultiplayerPeer.new()\n\n\nfunc _log(msg: String):\n\tprint_rich(\"[color=cyan]Server: \" + msg + \"[/color]\")\n\n\nfunc _ready() -> void:\n\tvar err = peer.create_server(PORT)\n\tif err != OK:\n\t\t_log(\"Failed to create ENet server %s (%d)\" % [error_string(err), err])\n\tmultiplayer.multiplayer_peer = peer\n\t\n\tvar credentials = HCredentials.new()\n\tcredentials.product_name = PRODUCT_NAME\n\tcredentials.product_version = PRODUCT_VERSION\n\tcredentials.product_id = PRODUCT_ID\n\tcredentials.sandbox_id = SANDBOX_ID\n\tcredentials.deployment_id = DEPLOYMENT_ID\n\tcredentials.client_id = SERVER_CLIENT_ID\n\tcredentials.client_secret = SERVER_CLIENT_SECRET\n\tcredentials.encryption_key = ENCRYPTION_KEY\n\t\n\tprint(\"Setting up EOS for dedicated server...\")\n\tHPlatform.cache_directory = ProjectSettings.globalize_path(\"user://eosg-server-cache\")\n\tHPlatform.is_server = true\n\tHPlatform.flags = EOS.Platform.PlatformFlags.DisableOverlay\n\t\n\tvar setup_success := await HPlatform.setup_eos_async(credentials)\n\tif not setup_success:\n\t\t_log(\"Failed to setup EOS. See logs for error details\")\n\t\treturn\n\t\n\tvar opts = EOS.Sessions.CreateSessionModificationOptions.new()\n\topts.bucket_id = \"party-bucket\"\n\topts.max_players = 4\n\topts.session_name = \"Party\"\n\t\n\tvar session := HSessions.create_session(opts)\n\tif not session:\n\t\treturn\n\t\n\t_log(\"Created session\")\n\t\n\tsession.add_attribute(\"level\", \"margao\", EOS.Sessions.SessionAttributeAdvertisementType.Advertise)\n\tsession.set_permission_level(EOS.Sessions.OnlineSessionPermissionLevel.PublicAdvertised)\n\tsession.set_host_address(\"localhost:\" + str(PORT))\n\tvar update_success := await HSessions.update_session_async(session)\n\tif not update_success:\n\t\treturn\n\t\n\t_log(\"Updated session\")\n\t\n\tvar active_sess := HSessions.get_active_session(\"Party\")\n\tif not active_sess:\n\t\treturn\n\t\n\t_log(\"sess is %s\" % active_sess.copy_info())\n\n\n\n# This is just added as a sample in your game you can register a player in\n# a different way also\n@rpc(\"any_peer\", \"reliable\")\nfunc c_s_register_player(puid: String):\n\tvar peerid = multiplayer.get_remote_sender_id()\n\t\n\tvar opts = EOS.Sessions.RegisterPlayersOptions.new()\n\topts.session_name = \"Party\"\n\topts.players_to_register = [puid]\n\tEOS.Sessions.SessionsInterface.register_players(opts)\n\t\n\tvar ret: Dictionary = await IEOS.sessions_interface_register_players_callback\n\tif not EOS.is_success(ret):\n\t\t_log(\"Failed to register player: puid=%s, result_code=%s\" % [puid, EOS.result_str(ret)])\n\t\ts_c_register_player_completed.rpc_id(peerid, false)\n\t\treturn\n\t\n\t_log(\"Registered player: puid\")\n\t\n\ts_c_register_player_completed.rpc_id(peerid, true)\n\n\n@rpc(\"reliable\")\nfunc s_c_register_player_completed(is_success: bool):\n\tpass\n"
  },
  {
    "path": "sample/dedicated_server_example/server_main.gd.uid",
    "content": "uid://bneij5syrcl1f\n"
  },
  {
    "path": "sample/dedicated_server_example/server_main.tscn",
    "content": "[gd_scene load_steps=2 format=3 uid=\"uid://dyuj4qlamg7b5\"]\n\n[ext_resource type=\"Script\" uid=\"uid://bneij5syrcl1f\" path=\"res://dedicated_server_example/server_main.gd\" id=\"1_74ooc\"]\n\n[node name=\"Root\" type=\"Control\"]\nlayout_mode = 3\nanchors_preset = 15\nanchor_right = 1.0\nanchor_bottom = 1.0\ngrow_horizontal = 2\ngrow_vertical = 2\nmouse_filter = 2\nscript = ExtResource(\"1_74ooc\")\n"
  },
  {
    "path": "sample/default_bus_layout.tres",
    "content": "[gd_resource type=\"AudioBusLayout\" load_steps=2 format=3 uid=\"uid://dfiyvl4a8dbhr\"]\n\n[sub_resource type=\"AudioEffectCapture\" id=\"AudioEffectCapture_j3pel\"]\nresource_name = \"Capture\"\n\n[resource]\nbus/1/name = &\"Microphone\"\nbus/1/solo = false\nbus/1/mute = false\nbus/1/bypass_fx = false\nbus/1/volume_db = 0.0\nbus/1/send = &\"Master\"\nbus/1/effect/0/effect = SubResource(\"AudioEffectCapture_j3pel\")\nbus/1/effect/0/enabled = true\n"
  },
  {
    "path": "sample/default_env.tres",
    "content": "[gd_resource type=\"Environment\" load_steps=2 format=3 uid=\"uid://cdoy56rtiqovw\"]\n\n[sub_resource type=\"Sky\" id=\"1\"]\n\n[resource]\nbackground_mode = 2\nsky = SubResource(\"1\")\n"
  },
  {
    "path": "sample/fonts/roboto-13r.tres",
    "content": "[gd_resource type=\"FontFile\" load_steps=2 format=3 uid=\"uid://da6bpapjl4a5k\"]\n\n[ext_resource type=\"FontFile\" uid=\"uid://ij5t8dy1m6e6\" path=\"res://fonts/Roboto-Regular.ttf\" id=\"1\"]\n\n[resource]\nfallbacks = Array[Font]([ExtResource(\"1\")])\ncache/0/16/0/ascent = 0.0\ncache/0/16/0/descent = 0.0\ncache/0/16/0/underline_position = 0.0\ncache/0/16/0/underline_thickness = 0.0\ncache/0/16/0/scale = 1.0\n"
  },
  {
    "path": "sample/fonts/roboto-16b.tres",
    "content": "[gd_resource type=\"FontFile\" load_steps=2 format=3 uid=\"uid://bghbav6kh0lsl\"]\n\n[ext_resource type=\"FontFile\" uid=\"uid://djdr1hyqtgka6\" path=\"res://fonts/Roboto-Bold.ttf\" id=\"1\"]\n\n[resource]\nfallbacks = Array[Font]([ExtResource(\"1\")])\ncache/0/16/0/ascent = 0.0\ncache/0/16/0/descent = 0.0\ncache/0/16/0/underline_position = 0.0\ncache/0/16/0/underline_thickness = 0.0\ncache/0/16/0/scale = 1.0\ncache/0/50/0/ascent = 0.0\ncache/0/50/0/descent = 0.0\ncache/0/50/0/underline_position = 0.0\ncache/0/50/0/underline_thickness = 0.0\ncache/0/50/0/scale = 1.0\n"
  },
  {
    "path": "sample/fonts/roboto-16r.tres",
    "content": "[gd_resource type=\"FontFile\" load_steps=2 format=3 uid=\"uid://bxcl265jykrk0\"]\n\n[ext_resource type=\"FontFile\" uid=\"uid://ij5t8dy1m6e6\" path=\"res://fonts/Roboto-Regular.ttf\" id=\"1\"]\n\n[resource]\nfallbacks = Array[Font]([ExtResource(\"1\")])\ncache/0/16/0/ascent = 0.0\ncache/0/16/0/descent = 0.0\ncache/0/16/0/underline_position = 0.0\ncache/0/16/0/underline_thickness = 0.0\ncache/0/16/0/scale = 1.0\ncache/0/50/0/ascent = 0.0\ncache/0/50/0/descent = 0.0\ncache/0/50/0/underline_position = 0.0\ncache/0/50/0/underline_thickness = 0.0\ncache/0/50/0/scale = 1.0\n"
  },
  {
    "path": "sample/fonts/roboto-32b.tres",
    "content": "[gd_resource type=\"FontFile\" load_steps=2 format=3 uid=\"uid://njn2rf7rj4ph\"]\n\n[ext_resource type=\"FontFile\" uid=\"uid://djdr1hyqtgka6\" path=\"res://fonts/Roboto-Bold.ttf\" id=\"1\"]\n\n[resource]\nfallbacks = Array[Font]([ExtResource(\"1\")])\ncache/0/16/0/ascent = 0.0\ncache/0/16/0/descent = 0.0\ncache/0/16/0/underline_position = 0.0\ncache/0/16/0/underline_thickness = 0.0\ncache/0/16/0/scale = 1.0\ncache/0/50/0/ascent = 0.0\ncache/0/50/0/descent = 0.0\ncache/0/50/0/underline_position = 0.0\ncache/0/50/0/underline_thickness = 0.0\ncache/0/50/0/scale = 1.0\n"
  },
  {
    "path": "sample/game/entities/bullet/bullet.gd",
    "content": "class_name Bullet\nextends Area2D\n\n\nconst SPEED = 2000.0\n\n\nvar dmg_amt = 25\nvar owner_peer_id: int\nvar owner_puid: String\n\n\nfunc _physics_process(delta: float) -> void:\n\tposition += transform.x * SPEED * delta\n\n\nfunc _on_visible_on_screen_notifier_2d_screen_exited() -> void:\n\tif is_multiplayer_authority():\n\t\tremove_bullet.rpc()\n\n\n@rpc(\"call_local\", \"reliable\")\nfunc remove_bullet():\n\tqueue_free()\n\n\nfunc _on_body_entered(body: Node2D) -> void:\n\tif not is_multiplayer_authority():\n\t\treturn\n\t\n\tif body is Player:\n\t\tbody.take_damage.rpc_id(body.peer_id, dmg_amt, owner_peer_id)\n\t\n\tremove_bullet.rpc()\n"
  },
  {
    "path": "sample/game/entities/bullet/bullet.gd.uid",
    "content": "uid://83g60od7sqbn\n"
  },
  {
    "path": "sample/game/entities/bullet/bullet.tscn",
    "content": "[gd_scene load_steps=4 format=3 uid=\"uid://b8clmnksfigve\"]\n\n[ext_resource type=\"Script\" uid=\"uid://83g60od7sqbn\" path=\"res://game/entities/bullet/bullet.gd\" id=\"1_dsf6p\"]\n[ext_resource type=\"Texture2D\" uid=\"uid://bcxe48xa5eniy\" path=\"res://game/entities/bullet/bullet.jpg\" id=\"2_y3kyh\"]\n\n[sub_resource type=\"RectangleShape2D\" id=\"RectangleShape2D_3mh06\"]\nsize = Vector2(40, 16)\n\n[node name=\"Bullet\" type=\"Area2D\"]\ncollision_mask = 3\nscript = ExtResource(\"1_dsf6p\")\n\n[node name=\"CollisionShape2D\" type=\"CollisionShape2D\" parent=\".\"]\nvisible = false\nposition = Vector2(20, 0)\nshape = SubResource(\"RectangleShape2D_3mh06\")\n\n[node name=\"VisibleOnScreenNotifier2D\" type=\"VisibleOnScreenNotifier2D\" parent=\".\"]\nposition = Vector2(10, 1.19209e-07)\nscale = Vector2(1, 0.4)\n\n[node name=\"Sprite2D\" type=\"Sprite2D\" parent=\".\"]\nposition = Vector2(10, 1.19209e-07)\nscale = Vector2(0.3125, 0.125)\ntexture = ExtResource(\"2_y3kyh\")\n\n[connection signal=\"body_entered\" from=\".\" to=\".\" method=\"_on_body_entered\"]\n[connection signal=\"screen_exited\" from=\"VisibleOnScreenNotifier2D\" to=\".\" method=\"_on_visible_on_screen_notifier_2d_screen_exited\"]\n"
  },
  {
    "path": "sample/game/entities/player/player.gd",
    "content": "class_name Player\nextends CharacterBody2D\n\n\nsignal health_changed\nsignal died(player, killing_peer_id: int)\n\n\nconst SPEED = 180.0\nconst SHOOT_COOLDOWN = 0.3\nconst BULLET = preload(\"res://game/entities/bullet/bullet.tscn\")\n\n\nvar peer_id: int\n## Remote product user id\nvar puid: String\n\nvar score = 0\nvar health = 100\nvar shoot_cooldown = SHOOT_COOLDOWN\n\n@onready var _gun_container: Node2D = %GunContainer\n@onready var _muzzle: Node2D = %Muzzle\n@onready var _panel: Panel = $Panel\n\n#region Built-in methods\n\nfunc _enter_tree() -> void:\n\tset_multiplayer_authority(peer_id)\n\n\nfunc _ready() -> void:\n\tStore.player_score_changed.emit()\n\tif not is_multiplayer_authority():\n\t\t_panel.self_modulate = Color(\"#ff0000\")\n\n\nfunc _physics_process(delta: float) -> void:\n\tif not is_multiplayer_authority(): return\n\t\n\t_handle_move()\n\t_handle_gun_rotation()\n\t\n\tif shoot_cooldown > -0.1:\n\t\tshoot_cooldown -= delta\n\t\n\tif not Store.is_mobile:\n\t\tif Input.is_action_pressed(&\"shoot\") && shoot_cooldown <= 0:\n\t\t\t_handle_shoot()\n\telse:\n\t\tif Store.shoot_joystick.get_deadzoned_vector().length_squared() > 0.1 && shoot_cooldown <= 0:\n\t\t\t_handle_shoot()\n\n#endregion\n\n\n#region Public methods\n\n@rpc(\"any_peer\", \"call_local\", \"reliable\")\nfunc take_damage(amt: int, owner_peer_id: int):\n\thealth = max(0, health - amt)\n\thealth_changed.emit()\n\tif health == 0:\n\t\tdied.emit(self, owner_peer_id)\n\t\tStore.network.add_score.rpc(owner_peer_id, 10)\n\n\n@rpc(\"call_local\", \"reliable\")\nfunc shoot(owner_peer_id: int, owner_puid: String, bname: String):\n\tvar bullet: Bullet = BULLET.instantiate()\n\tbullet.owner_peer_id = owner_peer_id\n\tbullet.owner_puid = owner_puid\n\tbullet.name = bname\n\tbullet.set_multiplayer_authority(owner_peer_id)\n\tget_parent().add_child(bullet)\n\tbullet.transform = _muzzle.global_transform\n\n#endregion\n\n\n#region Private methods\n\nfunc _handle_move():\n\tvar direction := Input.get_vector(\"move_left\", \"move_right\", \"move_up\", \"move_down\")\n\tvelocity = direction * SPEED\n\tmove_and_slide()\n\n\nfunc _handle_gun_rotation():\n\tif not Store.is_mobile:\n\t\t_gun_container.look_at(get_global_mouse_position())\n\telse:\n\t\t_gun_container.look_at(global_position + Store.shoot_joystick.get_deadzoned_vector())\n\n\nfunc _handle_shoot():\n\tshoot_cooldown = SHOOT_COOLDOWN\n\tvar bname = str(peer_id) + \"_\" + str(randi_range(1000, 9999))\n\tshoot.rpc(peer_id, puid, bname)\n\n#endregion\n"
  },
  {
    "path": "sample/game/entities/player/player.gd.uid",
    "content": "uid://cwybnfn6dv66t\n"
  },
  {
    "path": "sample/game/entities/player/player.tscn",
    "content": "[gd_scene load_steps=6 format=3 uid=\"uid://d25l4fa1sffqk\"]\n\n[ext_resource type=\"Script\" uid=\"uid://cwybnfn6dv66t\" path=\"res://game/entities/player/player.gd\" id=\"1_gheds\"]\n\n[sub_resource type=\"CircleShape2D\" id=\"CircleShape2D_yh8w5\"]\n\n[sub_resource type=\"StyleBoxFlat\" id=\"StyleBoxFlat_0phbn\"]\nbg_color = Color(0.594875, 0.0860397, 0.180462, 1)\n\n[sub_resource type=\"StyleBoxFlat\" id=\"StyleBoxFlat_2p5sl\"]\nbg_color = Color(1, 1, 1, 1)\ncorner_radius_top_left = 10\ncorner_radius_top_right = 10\ncorner_radius_bottom_right = 10\ncorner_radius_bottom_left = 10\ncorner_detail = 20\n\n[sub_resource type=\"SceneReplicationConfig\" id=\"SceneReplicationConfig_gepvl\"]\nproperties/0/path = NodePath(\".:position\")\nproperties/0/spawn = true\nproperties/0/replication_mode = 2\nproperties/1/path = NodePath(\"GunContainer:rotation\")\nproperties/1/spawn = true\nproperties/1/replication_mode = 2\n\n[node name=\"Player\" type=\"CharacterBody2D\" groups=[\"GRP_PLAYER\"]]\ncollision_layer = 2\nscript = ExtResource(\"1_gheds\")\n\n[node name=\"CollisionShape2D\" type=\"CollisionShape2D\" parent=\".\"]\nvisible = false\nshape = SubResource(\"CircleShape2D_yh8w5\")\n\n[node name=\"GunContainer\" type=\"Node2D\" parent=\".\"]\nunique_name_in_owner = true\n\n[node name=\"Gun\" type=\"Node2D\" parent=\"GunContainer\"]\nposition = Vector2(10, 0)\n\n[node name=\"Panel\" type=\"Panel\" parent=\"GunContainer/Gun\"]\noffset_top = -2.0\noffset_right = 6.0\noffset_bottom = 2.0\ntheme_override_styles/panel = SubResource(\"StyleBoxFlat_0phbn\")\n\n[node name=\"Muzzle\" type=\"Node2D\" parent=\"GunContainer/Gun\"]\nunique_name_in_owner = true\nposition = Vector2(5, 0)\n\n[node name=\"Panel\" type=\"Panel\" parent=\".\"]\noffset_left = -10.0\noffset_top = -10.0\noffset_right = 10.0\noffset_bottom = 10.0\ntheme_override_styles/panel = SubResource(\"StyleBoxFlat_2p5sl\")\n\n[node name=\"MultiplayerSynchronizer\" type=\"MultiplayerSynchronizer\" parent=\".\"]\nreplication_config = SubResource(\"SceneReplicationConfig_gepvl\")\n"
  },
  {
    "path": "sample/game/entities/wall/wall.tscn",
    "content": "[gd_scene load_steps=3 format=3 uid=\"uid://dnt3dorvwuw5y\"]\n\n[sub_resource type=\"RectangleShape2D\" id=\"RectangleShape2D_0hwfu\"]\nsize = Vector2(32, 32)\n\n[sub_resource type=\"StyleBoxFlat\" id=\"StyleBoxFlat_kvwfc\"]\nbg_color = Color(0.0889726, 0.111937, 0.180319, 1)\nborder_width_left = 1\nborder_width_top = 1\nborder_width_right = 1\nborder_width_bottom = 1\nborder_color = Color(0.0498713, 0.0669275, 0.115281, 1)\nborder_blend = true\n\n[node name=\"Wall\" type=\"StaticBody2D\"]\n\n[node name=\"CollisionShape2D\" type=\"CollisionShape2D\" parent=\".\"]\nvisible = false\nshape = SubResource(\"RectangleShape2D_0hwfu\")\n\n[node name=\"Panel\" type=\"Panel\" parent=\".\"]\noffset_left = -16.0\noffset_top = -16.0\noffset_right = 16.0\noffset_bottom = 16.0\ntheme_override_styles/panel = SubResource(\"StyleBoxFlat_kvwfc\")\n"
  },
  {
    "path": "sample/game/maps/map_bellandur.tscn",
    "content": "[gd_scene load_steps=4 format=4 uid=\"uid://cq20ci5f675b8\"]\n\n[ext_resource type=\"PackedScene\" uid=\"uid://dnt3dorvwuw5y\" path=\"res://game/entities/wall/wall.tscn\" id=\"1_r6dfo\"]\n\n[sub_resource type=\"TileSetScenesCollectionSource\" id=\"TileSetScenesCollectionSource_hd8jp\"]\nscenes/1/scene = ExtResource(\"1_r6dfo\")\n\n[sub_resource type=\"TileSet\" id=\"TileSet_1qt5j\"]\ntile_size = Vector2i(32, 32)\nsources/0 = SubResource(\"TileSetScenesCollectionSource_hd8jp\")\n\n[node name=\"MapBellandur\" type=\"Node2D\" groups=[\"GRP_MAP\"]]\n\n[node name=\"TileMapLayer\" type=\"TileMapLayer\" parent=\".\"]\ntile_map_data = PackedByteArray(\"AAAAAAAAAAAAAAAAAQABAAAAAAAAAAAAAQACAAAAAAAAAAAAAQADAAAAAAAAAAAAAQAAAAEAAAAAAAAAAQAAAAIAAAAAAAAAAQAAAAMAAAAAAAAAAQAAAAQAAAAAAAAAAQAEAAAAAAAAAAAAAQAFAAAAAAAAAAAAAQAGAAAAAAAAAAAAAQAHAAAAAAAAAAAAAQAIAAAAAAAAAAAAAQAJAAAAAAAAAAAAAQAAAAUAAAAAAAAAAQAAAAYAAAAAAAAAAQAAAAcAAAAAAAAAAQAAAAgAAAAAAAAAAQAAAAkAAAAAAAAAAQAAAAoAAAAAAAAAAQAAAAsAAAAAAAAAAQAAAAwAAAAAAAAAAQAAAA0AAAAAAAAAAQAAAA4AAAAAAAAAAQAAAA8AAAAAAAAAAQAAABAAAAAAAAAAAQAAABEAAAAAAAAAAQAAABIAAAAAAAAAAQAAABMAAAAAAAAAAQAiAAAAAAAAAAAAAQAhAAAAAAAAAAAAAQAgAAAAAAAAAAAAAQAfAAAAAAAAAAAAAQAeAAAAAAAAAAAAAQAdAAAAAAAAAAAAAQAcAAAAAAAAAAAAAQAbAAAAAAAAAAAAAQAaAAAAAAAAAAAAAQAZAAAAAAAAAAAAAQAYAAAAAAAAAAAAAQAXAAAAAAAAAAAAAQAWAAAAAAAAAAAAAQAVAAAAAAAAAAAAAQAUAAAAAAAAAAAAAQATAAAAAAAAAAAAAQASAAAAAAAAAAAAAQARAAAAAAAAAAAAAQAQAAAAAAAAAAAAAQAPAAAAAAAAAAAAAQAOAAAAAAAAAAAAAQANAAAAAAAAAAAAAQAMAAAAAAAAAAAAAQALAAAAAAAAAAAAAQAKAAAAAAAAAAAAAQAjAAAAAAAAAAAAAQAjAAEAAAAAAAAAAQAjAAIAAAAAAAAAAQAjAAMAAAAAAAAAAQAjAAQAAAAAAAAAAQAjAAUAAAAAAAAAAQAjAAYAAAAAAAAAAQAjAAcAAAAAAAAAAQAjAAgAAAAAAAAAAQAjAAkAAAAAAAAAAQAjAAoAAAAAAAAAAQAjAAsAAAAAAAAAAQAjAAwAAAAAAAAAAQAjAA0AAAAAAAAAAQAjAA4AAAAAAAAAAQAjAA8AAAAAAAAAAQAjABAAAAAAAAAAAQAjABEAAAAAAAAAAQAjABIAAAAAAAAAAQAjABMAAAAAAAAAAQAiABMAAAAAAAAAAQAhABMAAAAAAAAAAQAgABMAAAAAAAAAAQAfABMAAAAAAAAAAQAeABMAAAAAAAAAAQAdABMAAAAAAAAAAQAcABMAAAAAAAAAAQAbABMAAAAAAAAAAQAaABMAAAAAAAAAAQAZABMAAAAAAAAAAQAYABMAAAAAAAAAAQAXABMAAAAAAAAAAQAWABMAAAAAAAAAAQAVABMAAAAAAAAAAQAUABMAAAAAAAAAAQATABMAAAAAAAAAAQASABMAAAAAAAAAAQARABMAAAAAAAAAAQAQABMAAAAAAAAAAQAPABMAAAAAAAAAAQAOABMAAAAAAAAAAQANABMAAAAAAAAAAQAMABMAAAAAAAAAAQALABMAAAAAAAAAAQAKABMAAAAAAAAAAQAJABMAAAAAAAAAAQAIABMAAAAAAAAAAQAHABMAAAAAAAAAAQAGABMAAAAAAAAAAQAFABMAAAAAAAAAAQAEABMAAAAAAAAAAQADABMAAAAAAAAAAQACABMAAAAAAAAAAQABABMAAAAAAAAAAQAJAAoAAAAAAAAAAQAKAAoAAAAAAAAAAQALAAoAAAAAAAAAAQAMAAoAAAAAAAAAAQANAAoAAAAAAAAAAQAOAAoAAAAAAAAAAQAPAAoAAAAAAAAAAQAQAAoAAAAAAAAAAQARAAoAAAAAAAAAAQASAAoAAAAAAAAAAQATAAoAAAAAAAAAAQAUAAoAAAAAAAAAAQAVAAoAAAAAAAAAAQAWAAoAAAAAAAAAAQAXAAoAAAAAAAAAAQAYAAoAAAAAAAAAAQAZAAoAAAAAAAAAAQAaAAoAAAAAAAAAAQARAAUAAAAAAAAAAQARAAYAAAAAAAAAAQARAAcAAAAAAAAAAQARAAgAAAAAAAAAAQARAAkAAAAAAAAAAQARAAsAAAAAAAAAAQARAAwAAAAAAAAAAQARAA0AAAAAAAAAAQARAA4AAAAAAAAAAQARAA8AAAAAAAAAAQA=\")\ntile_set = SubResource(\"TileSet_1qt5j\")\n\n[node name=\"SpawnPoints\" type=\"Node2D\" parent=\".\"]\n\n[node name=\"Node2D\" type=\"Node2D\" parent=\"SpawnPoints\"]\nposition = Vector2(390, 210)\n\n[node name=\"Node2D2\" type=\"Node2D\" parent=\"SpawnPoints\"]\nposition = Vector2(732, 437)\n\n[node name=\"Node2D3\" type=\"Node2D\" parent=\"SpawnPoints\"]\nposition = Vector2(714, 216)\n\n[node name=\"Node2D4\" type=\"Node2D\" parent=\"SpawnPoints\"]\nposition = Vector2(397, 439)\n\n[node name=\"MapName\" type=\"Label\" parent=\".\"]\noffset_left = 8.0\noffset_top = 3.0\noffset_right = 67.0\noffset_bottom = 26.0\ntheme_override_colors/font_color = Color(0.52312, 0.52312, 0.52312, 1)\ntext = \"Bellandur\"\n"
  },
  {
    "path": "sample/game/maps/map_margao.tscn",
    "content": "[gd_scene load_steps=4 format=4 uid=\"uid://d25abb5oqolnx\"]\n\n[ext_resource type=\"PackedScene\" uid=\"uid://dnt3dorvwuw5y\" path=\"res://game/entities/wall/wall.tscn\" id=\"1_ccu0p\"]\n\n[sub_resource type=\"TileSetScenesCollectionSource\" id=\"TileSetScenesCollectionSource_hd8jp\"]\nscenes/1/scene = ExtResource(\"1_ccu0p\")\n\n[sub_resource type=\"TileSet\" id=\"TileSet_1qt5j\"]\ntile_size = Vector2i(32, 32)\nsources/0 = SubResource(\"TileSetScenesCollectionSource_hd8jp\")\n\n[node name=\"MapMargao\" type=\"Node2D\" groups=[\"GRP_MAP\"]]\n\n[node name=\"TileMapLayer\" type=\"TileMapLayer\" parent=\".\"]\ntile_map_data = PackedByteArray(\"AAAAAAAAAAAAAAAAAQABAAAAAAAAAAAAAQACAAAAAAAAAAAAAQADAAAAAAAAAAAAAQAAAAEAAAAAAAAAAQAAAAIAAAAAAAAAAQAAAAMAAAAAAAAAAQAAAAQAAAAAAAAAAQAEAAAAAAAAAAAAAQAFAAAAAAAAAAAAAQAGAAAAAAAAAAAAAQAHAAAAAAAAAAAAAQAIAAAAAAAAAAAAAQAJAAAAAAAAAAAAAQAAAAUAAAAAAAAAAQAAAAYAAAAAAAAAAQAAAAcAAAAAAAAAAQAAAAgAAAAAAAAAAQAAAAkAAAAAAAAAAQAAAAoAAAAAAAAAAQAAAAsAAAAAAAAAAQAAAAwAAAAAAAAAAQAAAA0AAAAAAAAAAQAAAA4AAAAAAAAAAQAAAA8AAAAAAAAAAQAAABAAAAAAAAAAAQAAABEAAAAAAAAAAQAAABIAAAAAAAAAAQAAABMAAAAAAAAAAQAiAAAAAAAAAAAAAQAhAAAAAAAAAAAAAQAgAAAAAAAAAAAAAQAfAAAAAAAAAAAAAQAeAAAAAAAAAAAAAQAdAAAAAAAAAAAAAQAcAAAAAAAAAAAAAQAbAAAAAAAAAAAAAQAaAAAAAAAAAAAAAQAZAAAAAAAAAAAAAQAYAAAAAAAAAAAAAQAXAAAAAAAAAAAAAQAWAAAAAAAAAAAAAQAVAAAAAAAAAAAAAQAUAAAAAAAAAAAAAQATAAAAAAAAAAAAAQASAAAAAAAAAAAAAQARAAAAAAAAAAAAAQAQAAAAAAAAAAAAAQAPAAAAAAAAAAAAAQAOAAAAAAAAAAAAAQANAAAAAAAAAAAAAQAMAAAAAAAAAAAAAQALAAAAAAAAAAAAAQAKAAAAAAAAAAAAAQAjAAAAAAAAAAAAAQAjAAEAAAAAAAAAAQAjAAIAAAAAAAAAAQAjAAMAAAAAAAAAAQAjAAQAAAAAAAAAAQAjAAUAAAAAAAAAAQAjAAYAAAAAAAAAAQAjAAcAAAAAAAAAAQAjAAgAAAAAAAAAAQAjAAkAAAAAAAAAAQAjAAoAAAAAAAAAAQAjAAsAAAAAAAAAAQAjAAwAAAAAAAAAAQAjAA0AAAAAAAAAAQAjAA4AAAAAAAAAAQAjAA8AAAAAAAAAAQAjABAAAAAAAAAAAQAjABEAAAAAAAAAAQAjABIAAAAAAAAAAQAjABMAAAAAAAAAAQAiABMAAAAAAAAAAQAhABMAAAAAAAAAAQAgABMAAAAAAAAAAQAfABMAAAAAAAAAAQAeABMAAAAAAAAAAQAdABMAAAAAAAAAAQAcABMAAAAAAAAAAQAbABMAAAAAAAAAAQAaABMAAAAAAAAAAQAZABMAAAAAAAAAAQAYABMAAAAAAAAAAQAXABMAAAAAAAAAAQAWABMAAAAAAAAAAQAVABMAAAAAAAAAAQAUABMAAAAAAAAAAQATABMAAAAAAAAAAQASABMAAAAAAAAAAQARABMAAAAAAAAAAQAQABMAAAAAAAAAAQAPABMAAAAAAAAAAQAOABMAAAAAAAAAAQANABMAAAAAAAAAAQAMABMAAAAAAAAAAQALABMAAAAAAAAAAQAKABMAAAAAAAAAAQAJABMAAAAAAAAAAQAIABMAAAAAAAAAAQAHABMAAAAAAAAAAQAGABMAAAAAAAAAAQAFABMAAAAAAAAAAQAEABMAAAAAAAAAAQADABMAAAAAAAAAAQACABMAAAAAAAAAAQABABMAAAAAAAAAAQAJAAIAAAAAAAAAAQAJAAMAAAAAAAAAAQAJAAQAAAAAAAAAAQAdAA4AAAAAAAAAAQAdAA0AAAAAAAAAAQAdAAwAAAAAAAAAAQA=\")\ntile_set = SubResource(\"TileSet_1qt5j\")\n\n[node name=\"SpawnPoints\" type=\"Node2D\" parent=\".\"]\n\n[node name=\"Node2D\" type=\"Node2D\" parent=\"SpawnPoints\"]\nposition = Vector2(117, 97)\n\n[node name=\"Node2D2\" type=\"Node2D\" parent=\"SpawnPoints\"]\nposition = Vector2(1032, 542)\n\n[node name=\"Node2D3\" type=\"Node2D\" parent=\"SpawnPoints\"]\nposition = Vector2(1039, 99)\n\n[node name=\"Node2D4\" type=\"Node2D\" parent=\"SpawnPoints\"]\nposition = Vector2(112, 546)\n\n[node name=\"MapName\" type=\"Label\" parent=\".\"]\noffset_left = 8.0\noffset_top = 3.0\noffset_right = 67.0\noffset_bottom = 26.0\ntheme_override_colors/font_color = Color(0.52312, 0.52312, 0.52312, 1)\ntext = \"Margao\"\n"
  },
  {
    "path": "sample/game/maps/map_new_york.tscn",
    "content": "[gd_scene load_steps=4 format=4 uid=\"uid://cutu8g5suwurd\"]\n\n[ext_resource type=\"PackedScene\" uid=\"uid://dnt3dorvwuw5y\" path=\"res://game/entities/wall/wall.tscn\" id=\"1_74dyf\"]\n\n[sub_resource type=\"TileSetScenesCollectionSource\" id=\"TileSetScenesCollectionSource_hd8jp\"]\nscenes/1/scene = ExtResource(\"1_74dyf\")\n\n[sub_resource type=\"TileSet\" id=\"TileSet_1qt5j\"]\ntile_size = Vector2i(32, 32)\nsources/0 = SubResource(\"TileSetScenesCollectionSource_hd8jp\")\n\n[node name=\"MapNewYork\" type=\"Node2D\" groups=[\"GRP_MAP\"]]\n\n[node name=\"TileMapLayer\" type=\"TileMapLayer\" parent=\".\"]\ntile_map_data = PackedByteArray(\"AAAAAAAAAAAAAAAAAQABAAAAAAAAAAAAAQACAAAAAAAAAAAAAQADAAAAAAAAAAAAAQAAAAEAAAAAAAAAAQAAAAIAAAAAAAAAAQAAAAMAAAAAAAAAAQAAAAQAAAAAAAAAAQAEAAAAAAAAAAAAAQAFAAAAAAAAAAAAAQAGAAAAAAAAAAAAAQAHAAAAAAAAAAAAAQAIAAAAAAAAAAAAAQAJAAAAAAAAAAAAAQAAAAUAAAAAAAAAAQAAAAYAAAAAAAAAAQAAAAcAAAAAAAAAAQAAAAgAAAAAAAAAAQAAAAkAAAAAAAAAAQAAAAoAAAAAAAAAAQAAAAsAAAAAAAAAAQAAAAwAAAAAAAAAAQAAAA0AAAAAAAAAAQAAAA4AAAAAAAAAAQAAAA8AAAAAAAAAAQAAABAAAAAAAAAAAQAAABEAAAAAAAAAAQAAABIAAAAAAAAAAQAAABMAAAAAAAAAAQAiAAAAAAAAAAAAAQAhAAAAAAAAAAAAAQAgAAAAAAAAAAAAAQAfAAAAAAAAAAAAAQAeAAAAAAAAAAAAAQAdAAAAAAAAAAAAAQAcAAAAAAAAAAAAAQAbAAAAAAAAAAAAAQAaAAAAAAAAAAAAAQAZAAAAAAAAAAAAAQAYAAAAAAAAAAAAAQAXAAAAAAAAAAAAAQAWAAAAAAAAAAAAAQAVAAAAAAAAAAAAAQAUAAAAAAAAAAAAAQATAAAAAAAAAAAAAQASAAAAAAAAAAAAAQARAAAAAAAAAAAAAQAQAAAAAAAAAAAAAQAPAAAAAAAAAAAAAQAOAAAAAAAAAAAAAQANAAAAAAAAAAAAAQAMAAAAAAAAAAAAAQALAAAAAAAAAAAAAQAKAAAAAAAAAAAAAQAjAAAAAAAAAAAAAQAjAAEAAAAAAAAAAQAjAAIAAAAAAAAAAQAjAAMAAAAAAAAAAQAjAAQAAAAAAAAAAQAjAAUAAAAAAAAAAQAjAAYAAAAAAAAAAQAjAAcAAAAAAAAAAQAjAAgAAAAAAAAAAQAjAAkAAAAAAAAAAQAjAAoAAAAAAAAAAQAjAAsAAAAAAAAAAQAjAAwAAAAAAAAAAQAjAA0AAAAAAAAAAQAjAA4AAAAAAAAAAQAjAA8AAAAAAAAAAQAjABAAAAAAAAAAAQAjABEAAAAAAAAAAQAjABIAAAAAAAAAAQAjABMAAAAAAAAAAQAiABMAAAAAAAAAAQAhABMAAAAAAAAAAQAgABMAAAAAAAAAAQAfABMAAAAAAAAAAQAeABMAAAAAAAAAAQAdABMAAAAAAAAAAQAcABMAAAAAAAAAAQAbABMAAAAAAAAAAQAaABMAAAAAAAAAAQAZABMAAAAAAAAAAQAYABMAAAAAAAAAAQAXABMAAAAAAAAAAQAWABMAAAAAAAAAAQAVABMAAAAAAAAAAQAUABMAAAAAAAAAAQATABMAAAAAAAAAAQASABMAAAAAAAAAAQARABMAAAAAAAAAAQAQABMAAAAAAAAAAQAPABMAAAAAAAAAAQAOABMAAAAAAAAAAQANABMAAAAAAAAAAQAMABMAAAAAAAAAAQALABMAAAAAAAAAAQAKABMAAAAAAAAAAQAJABMAAAAAAAAAAQAIABMAAAAAAAAAAQAHABMAAAAAAAAAAQAGABMAAAAAAAAAAQAFABMAAAAAAAAAAQAEABMAAAAAAAAAAQADABMAAAAAAAAAAQACABMAAAAAAAAAAQABABMAAAAAAAAAAQAMAAcAAAAAAAAAAQANAAcAAAAAAAAAAQAWAAwAAAAAAAAAAQAXAAwAAAAAAAAAAQAXAAcAAAAAAAAAAQAWAAcAAAAAAAAAAQANAAwAAAAAAAAAAQAMAAwAAAAAAAAAAQAEAAcAAAAAAAAAAQAFAAcAAAAAAAAAAQAGAAcAAAAAAAAAAQAHAAcAAAAAAAAAAQAIAAcAAAAAAAAAAQAJAAcAAAAAAAAAAQAKAAcAAAAAAAAAAQALAAcAAAAAAAAAAQANAAMAAAAAAAAAAQANAAQAAAAAAAAAAQANAAUAAAAAAAAAAQANAAYAAAAAAAAAAQAEAAwAAAAAAAAAAQAFAAwAAAAAAAAAAQAGAAwAAAAAAAAAAQAHAAwAAAAAAAAAAQAIAAwAAAAAAAAAAQAJAAwAAAAAAAAAAQAKAAwAAAAAAAAAAQALAAwAAAAAAAAAAQANAA0AAAAAAAAAAQANAA4AAAAAAAAAAQANAA8AAAAAAAAAAQANABAAAAAAAAAAAQAWAAMAAAAAAAAAAQAWAAQAAAAAAAAAAQAWAAUAAAAAAAAAAQAWAAYAAAAAAAAAAQAYAAcAAAAAAAAAAQAZAAcAAAAAAAAAAQAaAAcAAAAAAAAAAQAbAAcAAAAAAAAAAQAcAAcAAAAAAAAAAQAdAAcAAAAAAAAAAQAeAAcAAAAAAAAAAQAfAAcAAAAAAAAAAQAWAA8AAAAAAAAAAQAWABAAAAAAAAAAAQAYAAwAAAAAAAAAAQAZAAwAAAAAAAAAAQAaAAwAAAAAAAAAAQAbAAwAAAAAAAAAAQAcAAwAAAAAAAAAAQAdAAwAAAAAAAAAAQAeAAwAAAAAAAAAAQAfAAwAAAAAAAAAAQAWAA0AAAAAAAAAAQAWAA4AAAAAAAAAAQA=\")\ntile_set = SubResource(\"TileSet_1qt5j\")\n\n[node name=\"SpawnPoints\" type=\"Node2D\" parent=\".\"]\n\n[node name=\"Node2D\" type=\"Node2D\" parent=\"SpawnPoints\"]\nposition = Vector2(361, 176)\n\n[node name=\"Node2D2\" type=\"Node2D\" parent=\"SpawnPoints\"]\nposition = Vector2(777, 474)\n\n[node name=\"Node2D3\" type=\"Node2D\" parent=\"SpawnPoints\"]\nposition = Vector2(787, 184)\n\n[node name=\"Node2D4\" type=\"Node2D\" parent=\"SpawnPoints\"]\nposition = Vector2(358, 464)\n\n[node name=\"MapName\" type=\"Label\" parent=\".\"]\noffset_left = 8.0\noffset_top = 3.0\noffset_right = 67.0\noffset_bottom = 26.0\ntheme_override_colors/font_color = Color(0.52312, 0.52312, 0.52312, 1)\ntext = \"New York\"\n"
  },
  {
    "path": "sample/project.godot",
    "content": "; Engine configuration file.\n; It's best edited using the editor UI and not directly,\n; since the parameters that go here are not all obvious.\n;\n; Format:\n;   [section] ; section goes between []\n;   param=value ; assign values to parameters\n\nconfig_version=5\n\n[animation]\n\ncompatibility/default_parent_skeleton_in_mesh_instance_3d=true\n\n[application]\n\nconfig/name=\"Epic Online Services Godot 4.2+ (EOSG)\"\nrun/main_scene=\"res://Main.tscn\"\nconfig/features=PackedStringArray(\"4.5\")\nconfig/icon=\"res://logo.png\"\n\n[audio]\n\ndriver/enable_input=true\ndriver/mix_rate=48000\n\n[autoload]\n\nEnv=\"*res://scripts/Env.gd\"\nStore=\"*res://scripts/Store.gd\"\nEOSGRuntime=\"*res://addons/epic-online-services-godot/runtime.gd\"\nHPlatform=\"*res://addons/epic-online-services-godot/heos/hplatform.gd\"\nHAuth=\"*res://addons/epic-online-services-godot/heos/hauth.gd\"\nHAchievements=\"*res://addons/epic-online-services-godot/heos/hachievements.gd\"\nHFriends=\"*res://addons/epic-online-services-godot/heos/hfriends.gd\"\nHStats=\"*res://addons/epic-online-services-godot/heos/hstats.gd\"\nHLeaderboards=\"*res://addons/epic-online-services-godot/heos/hleaderboards.gd\"\nHLobbies=\"*res://addons/epic-online-services-godot/heos/hlobbies.gd\"\nHP2P=\"*res://addons/epic-online-services-godot/heos/hp2p.gd\"\nHSessions=\"*res://addons/epic-online-services-godot/heos/hsessions.gd\"\n\n[display]\n\nwindow/size/viewport_height=640\nwindow/stretch/mode=\"canvas_items\"\nwindow/dpi/allow_hidpi=false\n\n[dotnet]\n\nproject/assembly_name=\"Epic Online Services Godot 4.2+ (EOSG)\"\n\n[editor_plugins]\n\nenabled=PackedStringArray(\"res://addons/epic-online-services-godot/plugin.cfg\")\n\n[global_group]\n\nGRP_MAP=\"\"\nGRP_PLAYER=\"\"\n\n[input]\n\nmove_up={\n\"deadzone\": 0.5,\n\"events\": [Object(InputEventKey,\"resource_local_to_scene\":false,\"resource_name\":\"\",\"device\":-1,\"window_id\":0,\"alt_pressed\":false,\"shift_pressed\":false,\"ctrl_pressed\":false,\"meta_pressed\":false,\"pressed\":false,\"keycode\":0,\"physical_keycode\":87,\"key_label\":0,\"unicode\":119,\"location\":0,\"echo\":false,\"script\":null)\n]\n}\nmove_down={\n\"deadzone\": 0.5,\n\"events\": [Object(InputEventKey,\"resource_local_to_scene\":false,\"resource_name\":\"\",\"device\":-1,\"window_id\":0,\"alt_pressed\":false,\"shift_pressed\":false,\"ctrl_pressed\":false,\"meta_pressed\":false,\"pressed\":false,\"keycode\":0,\"physical_keycode\":83,\"key_label\":0,\"unicode\":115,\"location\":0,\"echo\":false,\"script\":null)\n]\n}\nmove_left={\n\"deadzone\": 0.5,\n\"events\": [Object(InputEventKey,\"resource_local_to_scene\":false,\"resource_name\":\"\",\"device\":-1,\"window_id\":0,\"alt_pressed\":false,\"shift_pressed\":false,\"ctrl_pressed\":false,\"meta_pressed\":false,\"pressed\":false,\"keycode\":0,\"physical_keycode\":65,\"key_label\":0,\"unicode\":97,\"location\":0,\"echo\":false,\"script\":null)\n]\n}\nmove_right={\n\"deadzone\": 0.5,\n\"events\": [Object(InputEventKey,\"resource_local_to_scene\":false,\"resource_name\":\"\",\"device\":-1,\"window_id\":0,\"alt_pressed\":false,\"shift_pressed\":false,\"ctrl_pressed\":false,\"meta_pressed\":false,\"pressed\":false,\"keycode\":0,\"physical_keycode\":68,\"key_label\":0,\"unicode\":100,\"location\":0,\"echo\":false,\"script\":null)\n]\n}\nshoot={\n\"deadzone\": 0.5,\n\"events\": [Object(InputEventMouseButton,\"resource_local_to_scene\":false,\"resource_name\":\"\",\"device\":-1,\"window_id\":0,\"alt_pressed\":false,\"shift_pressed\":false,\"ctrl_pressed\":false,\"meta_pressed\":false,\"button_mask\":0,\"position\":Vector2(0, 0),\"global_position\":Vector2(0, 0),\"factor\":1.0,\"button_index\":1,\"canceled\":false,\"pressed\":false,\"double_click\":false,\"script\":null)\n]\n}\npush_to_talk={\n\"deadzone\": 0.2,\n\"events\": [Object(InputEventKey,\"resource_local_to_scene\":false,\"resource_name\":\"\",\"device\":-1,\"window_id\":0,\"alt_pressed\":false,\"shift_pressed\":false,\"ctrl_pressed\":false,\"meta_pressed\":false,\"pressed\":false,\"keycode\":0,\"physical_keycode\":84,\"key_label\":0,\"unicode\":116,\"location\":0,\"echo\":false,\"script\":null)\n]\n}\n\n[physics]\n\ncommon/enable_pause_aware_picking=true\n\n[rendering]\n\nrenderer/rendering_method=\"gl_compatibility\"\nrenderer/rendering_method.mobile=\"gl_compatibility\"\ntextures/vram_compression/import_etc2_astc=true\nenvironment/defaults/default_clear_color=Color(0.121569, 0.121569, 0.121569, 1)\nenvironment/defaults/default_environment=\"res://default_env.tres\"\n"
  },
  {
    "path": "sample/scenes/AchievementsView/AchievementPopup.gd",
    "content": "class_name AchievementPopup\nextends StyledPopupWindow\n\n@onready var id_label = $VB/MC/VB/GridContainer/IdLabel\n@onready var flavor_label = $VB/MC/VB/GridContainer/FlavorLabel\n@onready var is_visible_label = $VB/MC/VB/GridContainer/IsVisibleLabel\n@onready var is_unlocked_label = $VB/MC/VB/GridContainer/IsUnlockedLabel\n@onready var stat_thresholds_vb = $VB/MC/VB/MC/VB/SC/StatThresholdsVB\n@onready var locked_image = $VB/MC/VB/HB/VB/LockedImage\n@onready var locked_label = $VB/MC/VB/HB/VB/LockedLabel\n@onready var locked_desc_label = $VB/MC/VB/HB/VB/LockedDescLabel\n@onready var unlocked_image = $VB/MC/VB/HB/VB2/UnlockedImage\n@onready var unlocked_label = $VB/MC/VB/HB/VB2/UnlockedLabel\n@onready var unlocked_desc_label = $VB/MC/VB/HB/VB2/UnlockedDescLabel\n\n@onready var unlock_btn = $VB/MC/VB/UnlockBtn\n\nvar achievement_node: AchievementsListAchievement\n\n\nfunc _ready() -> void:\n\tsuper._ready()\n\tunlock_btn.pressed.connect(_on_unlock_btn_pressed)\n\n\nfunc from_achievement_node(node: AchievementsListAchievement):\n\tachievement_node = node\n\tvar data := achievement_node.get_data()\n\n\tid_label.text = data.achievement_id\n\tflavor_label.text = data.flavor_text\n\tif data.is_hidden != null:\n\t\tif data.is_hidden:\n\t\t\tis_visible_label.text = \"False\"\n\t\telse:\n\t\t\tis_visible_label.text = \"True\"\n\telse:\n\t\tis_visible_label.text = \"NA\"\n\tif not data.is_unlocked():\n\t\tis_unlocked_label.text = \"No\"\n\t\tunlock_btn.disabled = false\n\telse:\n\t\tvar time_str = Time.get_datetime_string_from_unix_time(data.unlock_time)\n\t\tis_unlocked_label.text = \"Yes at \" + time_str\n\t\tunlock_btn.disabled = true\n\n\tfor child in stat_thresholds_vb.get_children():\n\t\tchild.queue_free()\n\n\tfor stat in data.stats:\n\t\tvar label = Label.new()\n\t\tlabel.text = \"%s : %s\" % [stat.name, stat.threshold_value]\n\t\tstat_thresholds_vb.add_child(label)\n\n\tlocked_image.fetch_image(data.locked_icon_url)\n\tlocked_label.text = \"Locked Name: \" + data.locked_display_name\n\tlocked_desc_label.text = \"Locked Desc: \" + data.locked_description\n\n\tunlocked_image.fetch_image(data.unlocked_icon_url)\n\tunlocked_label.text = \"Locked Name: \" + data.unlocked_display_name\n\tunlocked_desc_label.text = \"Locked Desc: \" + data.unlocked_description\n\n\nfunc _on_unlock_btn_pressed():\n\tvar data = achievement_node.get_data()\n\n\tunlock_btn.disabled = true\n\tvisible = false\n\tHAchievements.unlock_achievement_async(data.achievement_id)\n"
  },
  {
    "path": "sample/scenes/AchievementsView/AchievementPopup.gd.uid",
    "content": "uid://b8fpdhlcd5vf2\n"
  },
  {
    "path": "sample/scenes/AchievementsView/AchievementUnlockNotification.gd",
    "content": "class_name AchievementUnlockNotification\nextends Control\n\nvar _data: HAchievementData\n\n@onready var id_label = $MC/HB/VB/IdLabel\n@onready var name_label = $MC/HB/VB/NameLabel\n@onready var unlocked_image = $MC/HB/UnlockedImage\n@onready var anim = $Anim\n@onready var fade_out_timer = $FadeOutTimer\n\nfunc _ready() -> void:\n\tfade_out_timer.timeout.connect(_on_fade_out_timer_timeout)\n\n\nfunc from_achievement_data(data: HAchievementData):\n\t_data = data\n\n\tname_label.text = data.unlocked_display_name\n\tid_label.text = data.achievement_id\n\tif data.unlocked_icon_url != null:\n\t\tunlocked_image.fetch_image(data.unlocked_icon_url)\n\telse:\n\t\tunlocked_image.fetch_image(data.icon_url)\n\n\nfunc fade_in():\n\tanim.play(\"FadeIn\")\n\tfade_out_timer.start()\n\n\nfunc _on_fade_out_timer_timeout():\n\tanim.play_backwards(\"FadeIn\")\n\tawait anim.animation_finished\n\tqueue_free()\n"
  },
  {
    "path": "sample/scenes/AchievementsView/AchievementUnlockNotification.gd.uid",
    "content": "uid://dnm64cf611a0h\n"
  },
  {
    "path": "sample/scenes/AchievementsView/AchievementUnlockNotification.tscn",
    "content": "[gd_scene load_steps=6 format=3 uid=\"uid://b7hrrwwvjqycs\"]\n\n[ext_resource type=\"PackedScene\" uid=\"uid://djhhnis3ksdjk\" path=\"res://scenes/UI/NetworkImage.tscn\" id=\"1\"]\n[ext_resource type=\"Script\" uid=\"uid://dnm64cf611a0h\" path=\"res://scenes/AchievementsView/AchievementUnlockNotification.gd\" id=\"2\"]\n\n[sub_resource type=\"StyleBoxFlat\" id=\"1\"]\nbg_color = Color(0.0588235, 0.0588235, 0.0588235, 1)\nborder_width_left = 2\nborder_width_top = 2\nborder_width_right = 2\nborder_width_bottom = 2\nborder_color = Color(0.878431, 0.886275, 0.207843, 1)\nborder_blend = true\ncorner_radius_top_left = 8\ncorner_radius_top_right = 8\ncorner_radius_bottom_right = 8\ncorner_radius_bottom_left = 8\n\n[sub_resource type=\"Animation\" id=\"2\"]\nresource_name = \"FadeIn\"\nlength = 0.35\ntracks/0/type = \"value\"\ntracks/0/imported = false\ntracks/0/enabled = true\ntracks/0/path = NodePath(\".:modulate\")\ntracks/0/interp = 1\ntracks/0/loop_wrap = true\ntracks/0/keys = {\n\"times\": PackedFloat32Array(0, 0.35),\n\"transitions\": PackedFloat32Array(1, 0.5),\n\"update\": 0,\n\"values\": [Color(1, 1, 1, 0), Color(1, 1, 1, 1)]\n}\n\n[sub_resource type=\"Animation\" id=\"3\"]\nlength = 0.001\ntracks/0/type = \"value\"\ntracks/0/imported = false\ntracks/0/enabled = true\ntracks/0/path = NodePath(\".:modulate\")\ntracks/0/interp = 1\ntracks/0/loop_wrap = true\ntracks/0/keys = {\n\"times\": PackedFloat32Array(0),\n\"transitions\": PackedFloat32Array(1),\n\"update\": 0,\n\"values\": [Color(0, 0, 0, 1)]\n}\n\n[node name=\"AchievementUnlockNotification\" type=\"MarginContainer\"]\nmodulate = Color(0, 0, 0, 1)\noffset_right = 338.0\noffset_bottom = 80.0\nscript = ExtResource(\"2\")\n__meta__ = {\n\"_edit_use_anchors_\": false\n}\n\n[node name=\"BG\" type=\"PanelContainer\" parent=\".\"]\noffset_right = 338.0\noffset_bottom = 80.0\ntheme_override_styles/panel = SubResource(\"1\")\n\n[node name=\"MC\" type=\"MarginContainer\" parent=\".\"]\noffset_right = 338.0\noffset_bottom = 80.0\nmouse_filter = 2\ntheme_override_constants/margin_right = 8\ntheme_override_constants/margin_top = 8\ntheme_override_constants/margin_left = 8\ntheme_override_constants/margin_bottom = 8\n\n[node name=\"HB\" type=\"HBoxContainer\" parent=\"MC\"]\noffset_left = 8.0\noffset_top = 8.0\noffset_right = 330.0\noffset_bottom = 72.0\nmouse_filter = 2\ntheme_override_constants/separation = 8\n__meta__ = {\n\"_edit_use_anchors_\": false\n}\n\n[node name=\"UnlockedImage\" parent=\"MC/HB\" instance=ExtResource(\"1\")]\nsize_flags_vertical = 0\n\n[node name=\"VB\" type=\"VBoxContainer\" parent=\"MC/HB\"]\noffset_left = 72.0\noffset_right = 322.0\noffset_bottom = 64.0\nmouse_filter = 2\n\n[node name=\"Unlocked\" type=\"Label\" parent=\"MC/HB/VB\"]\noffset_right = 250.0\noffset_bottom = 14.0\ncustom_minimum_size = Vector2(250, 0)\ntext = \"New Achievement Unlocked!\"\nautowrap = true\n\n[node name=\"NameLabel\" type=\"Label\" parent=\"MC/HB/VB\"]\noffset_top = 18.0\noffset_right = 250.0\noffset_bottom = 32.0\ncustom_minimum_size = Vector2(250, 0)\ntext = \"Name here\"\nautowrap = true\n\n[node name=\"IdLabel\" type=\"Label\" parent=\"MC/HB/VB\"]\noffset_top = 36.0\noffset_right = 250.0\noffset_bottom = 50.0\ncustom_minimum_size = Vector2(250, 0)\ntext = \"ID: 123\"\nautowrap = true\n\n[node name=\"Anim\" type=\"AnimationPlayer\" parent=\".\"]\nanims/FadeIn = SubResource(\"2\")\nanims/RESET = SubResource(\"3\")\n\n[node name=\"FadeOutTimer\" type=\"Timer\" parent=\".\"]\nwait_time = 7.0\none_shot = true\n"
  },
  {
    "path": "sample/scenes/AchievementsView/AchievementsList.gd",
    "content": "class_name AchievementsList\nextends MarginContainer\n\nsignal achievement_pressed(node)\n\nconst ACHIEVEMENTS_LIST_ACHIEVEMENT = preload(\"res://scenes/AchievementsView/AchievementsListAchievement.tscn\")\n\nfunc _ready() -> void:\n\t_clear()\n\n\nfunc _clear() -> void:\n\t# Clear existing achievements\n\tfor child in $SC/VB.get_children():\n\t\tchild.queue_free()\n\n\nfunc from_achievements_array(arr: Array):\n\t_clear()\n\n\t# Populate new achievements\n\tfor achievement_data in arr:\n\t\tvar achievement = ACHIEVEMENTS_LIST_ACHIEVEMENT.instantiate()\n\t\t$SC/VB.add_child(achievement)\n\n\t\tachievement.pressed.connect(_on_achievement_pressed)\n\t\tachievement.from_achievement_data(achievement_data)\n\n\nfunc _on_achievement_pressed(node: AchievementsListAchievement):\n\tachievement_pressed.emit(node)\n"
  },
  {
    "path": "sample/scenes/AchievementsView/AchievementsList.gd.uid",
    "content": "uid://27jk4xa1yfq\n"
  },
  {
    "path": "sample/scenes/AchievementsView/AchievementsListAchievement.gd",
    "content": "class_name AchievementsListAchievement\nextends MarginContainer\n\n# warning-ignore:unused_signal\nsignal pressed(_self)\n\n@onready var id_label = $MC/HB/VB/IdLabel\n@onready var unlocked_image = $MC/HB/UnlockedImage as NetworkImage\n\n@onready var button = $RR/Button\n\nvar _data: HAchievementData\n\n\nfunc _ready():\n\tbutton.pressed.connect(func ():\n\t\tpressed.emit(self)\n\t)\n\n\nfunc from_achievement_data(data: HAchievementData):\n\t_data = data\n\n\tid_label.text = data.achievement_id\n\tif data.unlocked_icon_url != null:\n\t\tunlocked_image.fetch_image(data.unlocked_icon_url)\n\telse:\n\t\tunlocked_image.fetch_image(data.icon_url)\n\n\nfunc get_data() -> HAchievementData:\n\treturn _data\n"
  },
  {
    "path": "sample/scenes/AchievementsView/AchievementsListAchievement.gd.uid",
    "content": "uid://cuosdhat5m7tg\n"
  },
  {
    "path": "sample/scenes/AchievementsView/AchievementsListAchievement.tscn",
    "content": "[gd_scene load_steps=5 format=3 uid=\"uid://blvi28uiveh0a\"]\n\n[ext_resource type=\"Script\" uid=\"uid://cuosdhat5m7tg\" path=\"res://scenes/AchievementsView/AchievementsListAchievement.gd\" id=\"1\"]\n[ext_resource type=\"PackedScene\" uid=\"uid://djhhnis3ksdjk\" path=\"res://scenes/UI/NetworkImage.tscn\" id=\"2\"]\n\n[sub_resource type=\"StyleBoxFlat\" id=\"2\"]\nbg_color = Color(0.329412, 0.329412, 0.329412, 1)\ncorner_radius_top_left = 4\ncorner_radius_top_right = 4\ncorner_radius_bottom_right = 4\ncorner_radius_bottom_left = 4\n\n[sub_resource type=\"StyleBoxFlat\" id=\"1\"]\nbg_color = Color(0.2, 0.2, 0.2, 1)\ncorner_radius_top_left = 4\ncorner_radius_top_right = 4\ncorner_radius_bottom_right = 4\ncorner_radius_bottom_left = 4\n\n[node name=\"AchievementsListAchievement\" type=\"MarginContainer\"]\noffset_right = 326.0\noffset_bottom = 72.0\nscript = ExtResource(\"1\")\n__meta__ = {\n\"_edit_use_anchors_\": false\n}\n\n[node name=\"RR\" type=\"ReferenceRect\" parent=\".\"]\noffset_right = 326.0\noffset_bottom = 72.0\nborder_color = Color(1, 0, 0, 0)\n\n[node name=\"Button\" type=\"Button\" parent=\"RR\"]\nanchor_right = 1.0\nanchor_bottom = 1.0\nmouse_default_cursor_shape = 2\ntheme_override_styles/hover = SubResource(\"2\")\ntheme_override_styles/pressed = SubResource(\"2\")\ntheme_override_styles/focus = SubResource(\"2\")\ntheme_override_styles/normal = SubResource(\"1\")\n__meta__ = {\n\"_edit_use_anchors_\": false\n}\n\n[node name=\"MC\" type=\"MarginContainer\" parent=\".\"]\noffset_right = 326.0\noffset_bottom = 72.0\nmouse_filter = 2\ntheme_override_constants/margin_right = 4\ntheme_override_constants/margin_top = 4\ntheme_override_constants/margin_left = 4\ntheme_override_constants/margin_bottom = 4\n\n[node name=\"HB\" type=\"HBoxContainer\" parent=\"MC\"]\noffset_left = 4.0\noffset_top = 4.0\noffset_right = 322.0\noffset_bottom = 68.0\nmouse_filter = 2\n__meta__ = {\n\"_edit_use_anchors_\": false\n}\n\n[node name=\"UnlockedImage\" parent=\"MC/HB\" instance=ExtResource(\"2\")]\n\n[node name=\"VB\" type=\"VBoxContainer\" parent=\"MC/HB\"]\noffset_left = 68.0\noffset_right = 318.0\noffset_bottom = 64.0\nmouse_filter = 2\n\n[node name=\"IdLabel\" type=\"Label\" parent=\"MC/HB/VB\"]\noffset_right = 250.0\noffset_bottom = 14.0\ncustom_minimum_size = Vector2(250, 0)\ntext = \"ID: achievement_id_here_123456789\"\nautowrap = true\n"
  },
  {
    "path": "sample/scenes/AchievementsView/AchievementsView.gd",
    "content": "class_name AchievementsView\nextends VBoxContainer\n\n# Local cache of achievements\nvar achievements = {}\n\n@onready var _achievements_list = %AchievementsList\n@onready var _achievement_popup = %AchievementPopup\n@onready var refresh_btn = %RefreshBtn\n\n@onready var AchievementUnlockNotificationScene = preload (\"res://scenes/AchievementsView/AchievementUnlockNotification.tscn\")\n\n\nfunc _ready() -> void:\n\tHAchievements.achievement_unlocked.connect(_on_achievement_unlocked)\n\n\tvisibility_changed.connect(_get_achievements)\n\tHAuth.logged_out.connect(_on_logged_out)\n\n\t_achievements_list.achievement_pressed.connect(_on_achievement_pressed)\n\trefresh_btn.pressed.connect(_get_achievements)\n\n\nfunc _get_achievements():\n\tif not visible: return\n\n\tvar achievements_arr := await HAchievements.get_all_achievements_async()\n\tfor achievement in achievements_arr:\n\t\tachievements[achievement.achievement_id] = achievement\n\t\n\tvar player_achievements_arr := await HAchievements.get_player_achievements_async()\n\tfor player_achievement in player_achievements_arr:\n\t\tachievements[player_achievement.achievement_id].unlock_time = player_achievement.unlock_time\n\n\t_rebuild_ui()\n\n\nfunc _on_logged_out():\n\tachievements = {}\n\t_rebuild_ui()\n\n\nfunc _rebuild_ui():\n\t_achievements_list.from_achievements_array(achievements.values())\n\n\nfunc _on_achievement_pressed(node: AchievementsListAchievement):\n\t_achievement_popup.from_achievement_node(node)\n\t_achievement_popup.popup_centered()\n\n\nfunc _on_achievement_unlocked(data: Dictionary):\n\tvar achievement_id = data.achievement_id\n\tif achievements.has(achievement_id):\n\t\tachievements[data.achievement_id].unlock_time = data.unlock_time\n\t\n\t_rebuild_ui()\n\n\t# Show achievement unlocked notification\n\tvar notif = AchievementUnlockNotificationScene.instantiate()\n\tStore.get_view(\"Notifications\").add_notification(notif)\n\tnotif.from_achievement_data(achievements[data.achievement_id])\n"
  },
  {
    "path": "sample/scenes/AchievementsView/AchievementsView.gd.uid",
    "content": "uid://cjhi71075hj1y\n"
  },
  {
    "path": "sample/scenes/AchievementsView/AchievementsView.tscn",
    "content": "[gd_scene load_steps=12 format=3 uid=\"uid://d3hxdkoy73pf1\"]\n\n[ext_resource type=\"Script\" uid=\"uid://cjhi71075hj1y\" path=\"res://scenes/AchievementsView/AchievementsView.gd\" id=\"1\"]\n[ext_resource type=\"LabelSettings\" uid=\"uid://dcb771ib3tfno\" path=\"res://styles/ViewTitleLabelSettings.tres\" id=\"2_1831t\"]\n[ext_resource type=\"PackedScene\" uid=\"uid://djhhnis3ksdjk\" path=\"res://scenes/UI/NetworkImage.tscn\" id=\"3\"]\n[ext_resource type=\"Script\" uid=\"uid://27jk4xa1yfq\" path=\"res://scenes/AchievementsView/AchievementsList.gd\" id=\"4\"]\n[ext_resource type=\"PackedScene\" uid=\"uid://t8s6xh1ax7uy\" path=\"res://scenes/UI/PrimaryButton.tscn\" id=\"5\"]\n[ext_resource type=\"Script\" uid=\"uid://b8fpdhlcd5vf2\" path=\"res://scenes/AchievementsView/AchievementPopup.gd\" id=\"6\"]\n[ext_resource type=\"PackedScene\" uid=\"uid://blvi28uiveh0a\" path=\"res://scenes/AchievementsView/AchievementsListAchievement.tscn\" id=\"7\"]\n[ext_resource type=\"PackedScene\" uid=\"uid://dkprjbptror6n\" path=\"res://components/StyledPopupWindow/StyledPopupWindow.tscn\" id=\"8_37km7\"]\n[ext_resource type=\"FontFile\" uid=\"uid://djdr1hyqtgka6\" path=\"res://fonts/Roboto-Bold.ttf\" id=\"8_75ml2\"]\n\n[sub_resource type=\"StyleBoxEmpty\" id=\"1\"]\n\n[sub_resource type=\"StyleBoxEmpty\" id=\"StyleBoxEmpty_6nfih\"]\n\n[node name=\"AchievementsView\" type=\"VBoxContainer\"]\nanchors_preset = 15\nanchor_right = 1.0\nanchor_bottom = 1.0\nsize_flags_horizontal = 3\nsize_flags_vertical = 3\nscript = ExtResource(\"1\")\n\n[node name=\"Title\" type=\"Label\" parent=\".\"]\nlayout_mode = 2\nsize_flags_vertical = 1\ntext = \"Achievements\"\nlabel_settings = ExtResource(\"2_1831t\")\n\n[node name=\"MC\" type=\"MarginContainer\" parent=\".\"]\nlayout_mode = 2\ntheme_override_constants/margin_top = 8\ntheme_override_constants/margin_bottom = 8\n\n[node name=\"HBoxContainer\" type=\"HBoxContainer\" parent=\"MC\"]\nlayout_mode = 2\n\n[node name=\"RefreshBtn\" parent=\"MC/HBoxContainer\" instance=ExtResource(\"5\")]\nunique_name_in_owner = true\nlayout_mode = 2\nsize_flags_horizontal = 0\ntext = \"Refresh\"\n\n[node name=\"RR\" type=\"ReferenceRect\" parent=\".\"]\nlayout_mode = 2\nsize_flags_horizontal = 3\nsize_flags_vertical = 3\nborder_color = Color(1, 0, 0, 0)\n\n[node name=\"AchievementsList\" type=\"MarginContainer\" parent=\"RR\"]\nunique_name_in_owner = true\nlayout_mode = 0\nanchor_right = 1.0\nanchor_bottom = 1.0\nscript = ExtResource(\"4\")\n\n[node name=\"SC\" type=\"ScrollContainer\" parent=\"RR/AchievementsList\"]\nlayout_mode = 2\n\n[node name=\"VB\" type=\"VBoxContainer\" parent=\"RR/AchievementsList/SC\"]\nlayout_mode = 2\ntheme_override_constants/separation = 12\n\n[node name=\"AchievementsListAchievement\" parent=\"RR/AchievementsList/SC/VB\" instance=ExtResource(\"7\")]\nlayout_mode = 2\n\n[node name=\"AchievementsListAchievement2\" parent=\"RR/AchievementsList/SC/VB\" instance=ExtResource(\"7\")]\nlayout_mode = 2\n\n[node name=\"AchievementPopup\" parent=\".\" instance=ExtResource(\"8_37km7\")]\nunique_name_in_owner = true\ntitle = \"VIEW ACHIEVEMENT\"\nsize = Vector2i(572, 628)\nvisible = false\nscript = ExtResource(\"6\")\n\n[node name=\"VB\" parent=\"AchievementPopup\" index=\"1\"]\noffset_right = 568.0\noffset_bottom = 624.0\n\n[node name=\"GridContainer\" type=\"GridContainer\" parent=\"AchievementPopup/VB/MC/VB\" index=\"0\"]\nlayout_mode = 2\ntheme_override_constants/h_separation = 64\ncolumns = 2\n\n[node name=\"IdLabelTitle\" type=\"Label\" parent=\"AchievementPopup/VB/MC/VB/GridContainer\"]\nlayout_mode = 2\ntext = \"Id\"\n\n[node name=\"IdLabel\" type=\"Label\" parent=\"AchievementPopup/VB/MC/VB/GridContainer\"]\nlayout_mode = 2\n\n[node name=\"FlavorLabelTitle\" type=\"Label\" parent=\"AchievementPopup/VB/MC/VB/GridContainer\"]\nlayout_mode = 2\ntext = \"Flavor Text\"\n\n[node name=\"FlavorLabel\" type=\"Label\" parent=\"AchievementPopup/VB/MC/VB/GridContainer\"]\nlayout_mode = 2\n\n[node name=\"IsVisibleLabelTitle\" type=\"Label\" parent=\"AchievementPopup/VB/MC/VB/GridContainer\"]\nlayout_mode = 2\ntext = \"Is Visible\"\n\n[node name=\"IsVisibleLabel\" type=\"Label\" parent=\"AchievementPopup/VB/MC/VB/GridContainer\"]\nlayout_mode = 2\ntext = \"Yes\"\n\n[node name=\"IsUnlockedLabelTitle\" type=\"Label\" parent=\"AchievementPopup/VB/MC/VB/GridContainer\"]\nlayout_mode = 2\ntext = \"Is Unlocked\"\n\n[node name=\"IsUnlockedLabel\" type=\"Label\" parent=\"AchievementPopup/VB/MC/VB/GridContainer\"]\nlayout_mode = 2\ntext = \"Yes\"\n\n[node name=\"HSeparator2\" type=\"HSeparator\" parent=\"AchievementPopup/VB/MC/VB\" index=\"1\"]\nlayout_mode = 2\ntheme_override_constants/separation = 16\n\n[node name=\"MC\" type=\"MarginContainer\" parent=\"AchievementPopup/VB/MC/VB\" index=\"2\"]\nlayout_mode = 2\ntheme_override_constants/margin_top = 8\ntheme_override_constants/margin_bottom = 8\n\n[node name=\"VB\" type=\"VBoxContainer\" parent=\"AchievementPopup/VB/MC/VB/MC\"]\nlayout_mode = 2\n\n[node name=\"StatThesholdsLabel\" type=\"Label\" parent=\"AchievementPopup/VB/MC/VB/MC/VB\"]\nlayout_mode = 2\ntheme_override_fonts/font = ExtResource(\"8_75ml2\")\ntext = \"Stat Thresholds\"\n\n[node name=\"SC\" type=\"ScrollContainer\" parent=\"AchievementPopup/VB/MC/VB/MC/VB\"]\ncustom_minimum_size = Vector2(0, 50)\nlayout_mode = 2\n\n[node name=\"StatThresholdsVB\" type=\"VBoxContainer\" parent=\"AchievementPopup/VB/MC/VB/MC/VB/SC\"]\nlayout_mode = 2\n\n[node name=\"Label\" type=\"Label\" parent=\"AchievementPopup/VB/MC/VB/MC/VB/SC/StatThresholdsVB\"]\nlayout_mode = 2\ntext = \"Name: Value\"\n\n[node name=\"HB\" type=\"HBoxContainer\" parent=\"AchievementPopup/VB/MC/VB\" index=\"3\"]\nlayout_mode = 2\n\n[node name=\"VB\" type=\"VBoxContainer\" parent=\"AchievementPopup/VB/MC/VB/HB\"]\nlayout_mode = 2\ntheme_override_constants/separation = 8\n\n[node name=\"LockedImage\" parent=\"AchievementPopup/VB/MC/VB/HB/VB\" instance=ExtResource(\"3\")]\nlayout_mode = 2\n\n[node name=\"LockedLabel\" type=\"Label\" parent=\"AchievementPopup/VB/MC/VB/HB/VB\"]\nlayout_mode = 2\ntext = \"Locked Name\"\n\n[node name=\"LockedDescLabel\" type=\"RichTextLabel\" parent=\"AchievementPopup/VB/MC/VB/HB/VB\"]\ncustom_minimum_size = Vector2(250, 0)\nlayout_mode = 2\ntext = \"(LOCK) Desc for Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis sit amet blandit lectus, ac eleifend erat. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.\"\nfit_content = true\n\n[node name=\"VS\" type=\"VSeparator\" parent=\"AchievementPopup/VB/MC/VB/HB\"]\ncustom_minimum_size = Vector2(16, 0)\nlayout_mode = 2\n\n[node name=\"VB2\" type=\"VBoxContainer\" parent=\"AchievementPopup/VB/MC/VB/HB\"]\nlayout_mode = 2\ntheme_override_constants/separation = 8\n\n[node name=\"UnlockedImage\" parent=\"AchievementPopup/VB/MC/VB/HB/VB2\" instance=ExtResource(\"3\")]\nlayout_mode = 2\n\n[node name=\"UnlockedLabel\" type=\"Label\" parent=\"AchievementPopup/VB/MC/VB/HB/VB2\"]\nlayout_mode = 2\ntext = \"Unlocked Name\"\n\n[node name=\"UnlockedDescLabel\" type=\"RichTextLabel\" parent=\"AchievementPopup/VB/MC/VB/HB/VB2\"]\ncustom_minimum_size = Vector2(250, 0)\nlayout_mode = 2\ntext = \"Desc for Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis sit amet blandit lectus, ac eleifend erat. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.\"\nfit_content = true\n\n[node name=\"HSeparator\" type=\"HSeparator\" parent=\"AchievementPopup/VB/MC/VB\" index=\"4\"]\nlayout_mode = 2\ntheme_override_styles/separator = SubResource(\"1\")\n\n[node name=\"UnlockBtn\" parent=\"AchievementPopup/VB/MC/VB\" index=\"5\" instance=ExtResource(\"5\")]\nlayout_mode = 2\nsize_flags_horizontal = 8\ntheme_override_styles/focus = SubResource(\"StyleBoxEmpty_6nfih\")\ntext = \"Unlock\"\n\n[editable path=\"AchievementPopup\"]\n"
  },
  {
    "path": "sample/scenes/CustomInvitesView/CustomInvitesView.gd",
    "content": "class_name CustomInvitesView\nextends VBoxContainer\n\n@onready var payload_textedit = %PayloadTextEdit\n@onready var send_invite_btn = %SendInviteBtn\n\nfunc _ready() -> void:\n\tIEOS.custom_invites_interface_send_custom_invite_callback.connect(_on_send_custom_invite_callback)\n\tIEOS.custom_invites_interface_custom_invite_accepted_callback.connect(_on_custom_invite_accepted_callback)\n\tIEOS.custom_invites_interface_custom_invite_received_callback.connect(_on_custom_invite_received_callback)\n\tIEOS.custom_invites_interface_custom_invite_rejected_callback.connect(_on_custom_invite_rejected_callback)\n\tIEOS.custom_invites_interface_request_to_join_received_callback.connect(_on_request_to_join_received_callback)\n\tIEOS.custom_invites_interface_request_to_join_response_received_callback.connect(_on_request_to_join_response_received_callback)\n\tIEOS.custom_invites_interface_request_to_join_accepted_callback.connect(_on_request_to_join_accepted_callback)\n\tIEOS.custom_invites_interface_request_to_join_rejected_callback.connect(_on_request_to_join_rejected_callback)\n\n\tsend_invite_btn.pressed.connect(_on_send_invite_btn_pressed)\n\tpayload_textedit.text_changed.connect(_on_payload_textedit_text_changed)\n\tsend_invite_btn.disabled = true\n\nfunc _on_send_custom_invite_callback(data: Dictionary):\n\tprint(\"--- Custom Invites: send_custom_invite_callback: \", EOS.result_str(data))\n\nfunc _on_custom_invite_accepted_callback(data: Dictionary):\n\tprint(\"--- Custom Invites: custom_invite_accepted_callback: \", data)\n\n\tvar finalize_opts = EOS.CustomInvites.FinalizeInviteOptions.new()\n\tfinalize_opts.target_user_id = data.target_user_id\n\tfinalize_opts.custom_invite_id = data.custom_invite_id\n\tfinalize_opts.processing_result = EOS.Result.Success\n\n\tvar res = EOS.CustomInvites.CustomInvitesInterface.finalize_invite(finalize_opts)\n\tprint(\"--- Custom Invites: finalize_invite: \", EOS.result_str(res))\n\nfunc _on_custom_invite_received_callback(data: Dictionary):\n\tprint(\"--- Custom Invites: custom_invite_received_callback: \", data)\n\nfunc _on_custom_invite_rejected_callback(data: Dictionary):\n\tprint(\"--- Custom Invites: custom_invite_rejected_callback: \", data)\n\nfunc _on_request_to_join_received_callback(data: Dictionary):\n\tprint(\"--- Custom Invites: request_to_join_received_callback: \", EOS.result_str(data))\n\nfunc _on_request_to_join_response_received_callback(data: Dictionary):\n\tprint(\"--- Custom Invites: request_to_join_response_received_callback: \", EOS.result_str(data))\n\nfunc _on_request_to_join_accepted_callback(data: Dictionary):\n\tprint(\"--- Custom Invites: request_to_join_accepted_callback: \", EOS.result_str(data))\n\nfunc _on_request_to_join_rejected_callback(data: Dictionary):\n\tprint(\"--- Custom Invites: request_to_join_rejected_callback: \", EOS.result_str(data))\n\nfunc _on_send_invite_btn_pressed():\n\tvar set_invite_opts = EOS.CustomInvites.SetCustomInviteOptions.new()\n\tset_invite_opts.payload = payload_textedit.text\n\tvar set_res: EOS.Result = EOS.CustomInvites.CustomInvitesInterface.set_custom_invite(set_invite_opts)\n\tprint(\"--- Custom Invites: set_custom_invite: \", EOS.result_str(set_res))\n\n\tvar send_invite_opts = EOS.CustomInvites.SendCustomInviteOptions.new()\n\tsend_invite_opts.target_user_ids = [Store.second_product_user_id]\n\tEOS.CustomInvites.CustomInvitesInterface.send_custom_invite(send_invite_opts)\n\tpayload_textedit.text = \"\"\n\nfunc _on_payload_textedit_text_changed():\n\tif payload_textedit.text.strip_edges() == \"\":\n\t\tsend_invite_btn.disabled = true\n\telse:\n\t\tsend_invite_btn.disabled = false\n"
  },
  {
    "path": "sample/scenes/CustomInvitesView/CustomInvitesView.gd.uid",
    "content": "uid://ddkxgj5m43swv\n"
  },
  {
    "path": "sample/scenes/CustomInvitesView/CustomInvitesView.tscn",
    "content": "[gd_scene load_steps=4 format=3 uid=\"uid://d2bkej1dakv6s\"]\n\n[ext_resource type=\"Script\" uid=\"uid://ddkxgj5m43swv\" path=\"res://scenes/CustomInvitesView/CustomInvitesView.gd\" id=\"1\"]\n[ext_resource type=\"LabelSettings\" uid=\"uid://dcb771ib3tfno\" path=\"res://styles/ViewTitleLabelSettings.tres\" id=\"2_u46xl\"]\n[ext_resource type=\"PackedScene\" uid=\"uid://t8s6xh1ax7uy\" path=\"res://scenes/UI/PrimaryButton.tscn\" id=\"5\"]\n\n[node name=\"CustomInvitesView\" type=\"VBoxContainer\"]\nanchors_preset = 15\nanchor_right = 1.0\nanchor_bottom = 1.0\nsize_flags_horizontal = 3\nsize_flags_vertical = 3\nscript = ExtResource(\"1\")\n\n[node name=\"Title\" type=\"Label\" parent=\".\"]\nlayout_mode = 2\nsize_flags_vertical = 1\ntext = \"Custom Invites\"\nlabel_settings = ExtResource(\"2_u46xl\")\n\n[node name=\"VB\" type=\"VBoxContainer\" parent=\".\"]\nlayout_mode = 2\n\n[node name=\"PayloadTextEdit\" type=\"TextEdit\" parent=\"VB\"]\nunique_name_in_owner = true\ncustom_minimum_size = Vector2(250, 75)\nlayout_mode = 2\nsize_flags_horizontal = 0\nplaceholder_text = \"Enter payload here\"\n\n[node name=\"SendInviteBtn\" parent=\"VB\" instance=ExtResource(\"5\")]\nunique_name_in_owner = true\nlayout_mode = 2\nsize_flags_horizontal = 0\ntext = \"Send Invite\"\n"
  },
  {
    "path": "sample/scenes/FriendsView/FriendsView.gd",
    "content": "class_name FriendsView\nextends VBoxContainer\n\n# Local cache of friends data\nvar friends = []\n\n@onready var list_title_rich_text_label = %ListTitleRichTextLabel\n@onready var friend_richtextlabel = %FriendsRichTextLabel\n\nfunc _ready() -> void:\n\tvisibility_changed.connect(_query_friends)\n\tHAuth.logged_out.connect(_on_logged_out)\n\nfunc _query_friends():\n\tif not visible: return\n\n\tif HAuth.epic_account_id == \"\":\n\t\tprint(\"Unable to query friends. Needs to login with Epic Games account.\")\n\t\treturn\n\t\n\tfriends = await HFriends.get_friends_async()\n\t_rebuild_ui()\n\t\n\nfunc _on_logged_out():\n\tfriends = []\n\t_rebuild_ui()\n\n\nfunc _rebuild_ui():\n\tlist_title_rich_text_label.text = \"[b]Friends List (%s)[/b]\" % str(friends.size())\n\n\tvar table_bbcode = \"\"\"[table=4]\n[cell][b]Display Name[/b][/cell]\n[cell][b]User Id[/b][/cell]\n[cell][b]Nickname[/b][/cell]\n[cell][b]Country[/b][/cell]\n%s\n[/table]\n\"\"\"\n\tvar rows_bbcode = \"\"\n\tfor friend in friends:\n\t\tvar nickname = friend.nickname if friend.nickname != \"\" else \"-\"\n\t\tvar country = friend.country if friend.country != \"\" else \"-\"\n\t\trows_bbcode += \"[cell]%s[/cell][cell]%s[/cell][cell]%s[/cell][cell]%s[/cell]\" % \\\n\t\t\t [friend.display_name_sanitized, friend.user_id, nickname, country]\n\tfriend_richtextlabel.text = table_bbcode % rows_bbcode\n"
  },
  {
    "path": "sample/scenes/FriendsView/FriendsView.gd.uid",
    "content": "uid://dx8eth83tfuvn\n"
  },
  {
    "path": "sample/scenes/FriendsView/FriendsView.tscn",
    "content": "[gd_scene load_steps=5 format=3 uid=\"uid://t016k2yh382d\"]\n\n[ext_resource type=\"Script\" uid=\"uid://dx8eth83tfuvn\" path=\"res://scenes/FriendsView/FriendsView.gd\" id=\"1\"]\n[ext_resource type=\"LabelSettings\" uid=\"uid://dcb771ib3tfno\" path=\"res://styles/ViewTitleLabelSettings.tres\" id=\"2_5qe5o\"]\n[ext_resource type=\"FontFile\" uid=\"uid://bghbav6kh0lsl\" path=\"res://fonts/roboto-16b.tres\" id=\"3\"]\n\n[sub_resource type=\"StyleBoxEmpty\" id=\"StyleBoxEmpty_igci0\"]\n\n[node name=\"FriendsView\" type=\"VBoxContainer\"]\nanchors_preset = 15\nanchor_right = 1.0\nanchor_bottom = 1.0\nsize_flags_horizontal = 3\nsize_flags_vertical = 3\nscript = ExtResource(\"1\")\n\n[node name=\"Title\" type=\"Label\" parent=\".\"]\nlayout_mode = 2\nsize_flags_vertical = 1\ntext = \"Friends\"\nlabel_settings = ExtResource(\"2_5qe5o\")\n\n[node name=\"VB\" type=\"VBoxContainer\" parent=\".\"]\nlayout_mode = 2\ntheme_override_constants/separation = 8\n\n[node name=\"ListTitleRichTextLabel\" type=\"RichTextLabel\" parent=\"VB\"]\nunique_name_in_owner = true\nlayout_mode = 2\nfocus_mode = 2\ntheme_override_constants/table_h_separation = 16\ntheme_override_constants/table_v_separation = 4\ntheme_override_fonts/bold_font = ExtResource(\"3\")\ntheme_override_styles/focus = SubResource(\"StyleBoxEmpty_igci0\")\nbbcode_enabled = true\ntext = \"[b]Friends List[/b]\"\nfit_content = true\ncontext_menu_enabled = true\nselection_enabled = true\n\n[node name=\"FriendsRichTextLabel\" type=\"RichTextLabel\" parent=\"VB\"]\nunique_name_in_owner = true\nlayout_mode = 2\nfocus_mode = 2\ntheme_override_constants/table_h_separation = 16\ntheme_override_constants/table_v_separation = 4\ntheme_override_fonts/bold_font = ExtResource(\"3\")\ntheme_override_styles/focus = SubResource(\"StyleBoxEmpty_igci0\")\nbbcode_enabled = true\nfit_content = true\ncontext_menu_enabled = true\nselection_enabled = true\n"
  },
  {
    "path": "sample/scenes/LeaderboardsView/LeaderboardsView.gd",
    "content": "class_name LeaderboardsView\nextends VBoxContainer\n\n# Local cache of leaderboard data\nvar leaderboards = []\n\n@onready var select_leaderboard_btn = %SelectLeaderboardBtn\n@onready var view_leaderboard_btn = %ViewLeaderboardBtn\n@onready var leaderboard_id = %LeaderboardId\n@onready var leaderboard_data_richtextlabel = %LeaderboardDataRichTextLabel\n\nvar selected_leaderboard = {\n\tid = \"\",\n\trecords = []\n}\n\nfunc _ready() -> void:\n\tvisibility_changed.connect(_on_query_leaderboard)\n\tHAuth.logged_out.connect(_on_logged_out)\n\tview_leaderboard_btn.pressed.connect(_on_view_leaderboard_btn_pressed)\n\n\t_rebuild_ui()\n\n\nfunc _on_query_leaderboard():\n\tif not visible: return\n\n\tleaderboards = await HLeaderboards.get_leaderboard_definitions_async()\n\n\t_update_select_leaderboard_button()\n\t\n\nfunc _on_logged_out():\n\tleaderboards = []\n\t_update_select_leaderboard_button()\n\tselected_leaderboard.id = \"\"\n\tselected_leaderboard.records = []\n\t_rebuild_ui()\n\n\nfunc _update_select_leaderboard_button():\n\tselect_leaderboard_btn.clear()\n\n\tfor i in leaderboards.size():\n\t\tvar id = leaderboards[i].leaderboard_id\n\t\tselect_leaderboard_btn.add_item(id, i)\n\t\tselect_leaderboard_btn.set_item_metadata(i, id)\n\n\nfunc _on_view_leaderboard_btn_pressed():\n\tvar selected_leaderboard_id = select_leaderboard_btn.get_selected_metadata()\n\tvar records = await HLeaderboards.get_leaderboard_records_async(selected_leaderboard_id)\n\n\tselected_leaderboard.id = selected_leaderboard_id\n\tselected_leaderboard.records = records\n\t_rebuild_ui()\n\n\nfunc _rebuild_ui():\n\tif not selected_leaderboard.id:\n\t\tleaderboard_id.visible = false\n\t\tleaderboard_data_richtextlabel.visible = false\n\telse:\n\t\tleaderboard_id.visible = true\n\t\tleaderboard_data_richtextlabel.visible = true\n\n\tleaderboard_id.text = selected_leaderboard.id\n\tvar base_bbcode = \"\"\"[table=3]\n[cell][b]Rank[/b][/cell]\n[cell][b]Score[/b][/cell]\n[cell][b]User[/b][/cell]\n%s\n[/table]\"\"\"\n\n\tvar rows_bbcode = \"\"\n\tfor record in selected_leaderboard.records:\n\t\trows_bbcode += \"[cell]%s[/cell]\" % record.rank\n\t\tif record.score != null:\n\t\t\trows_bbcode += \"[cell]%s[/cell]\" % record.score\n\t\tif record.user_display_name != null:\n\t\t\tvar display_name = record.user_display_name\n\t\t\tif record.user_id == HAuth.product_user_id:\n\t\t\t\tdisplay_name += \"[b] (you)[/b]\"\n\t\t\trows_bbcode += \"[cell]%s[/cell]\" % display_name\n\n\tleaderboard_data_richtextlabel.text = base_bbcode % rows_bbcode\n"
  },
  {
    "path": "sample/scenes/LeaderboardsView/LeaderboardsView.gd.uid",
    "content": "uid://dkhn2a8wdwx21\n"
  },
  {
    "path": "sample/scenes/LeaderboardsView/LeaderboardsView.tscn",
    "content": "[gd_scene load_steps=6 format=3 uid=\"uid://5xrk7nvpwosj\"]\n\n[ext_resource type=\"Script\" uid=\"uid://dkhn2a8wdwx21\" path=\"res://scenes/LeaderboardsView/LeaderboardsView.gd\" id=\"1\"]\n[ext_resource type=\"LabelSettings\" uid=\"uid://dcb771ib3tfno\" path=\"res://styles/ViewTitleLabelSettings.tres\" id=\"2_6kpeu\"]\n[ext_resource type=\"FontFile\" uid=\"uid://bghbav6kh0lsl\" path=\"res://fonts/roboto-16b.tres\" id=\"3\"]\n[ext_resource type=\"PackedScene\" uid=\"uid://t8s6xh1ax7uy\" path=\"res://scenes/UI/PrimaryButton.tscn\" id=\"5\"]\n\n[sub_resource type=\"StyleBoxEmpty\" id=\"StyleBoxEmpty_tgtn6\"]\n\n[node name=\"LeaderboardsView\" type=\"VBoxContainer\"]\nanchors_preset = 15\nanchor_right = 1.0\nanchor_bottom = 1.0\nsize_flags_horizontal = 3\nsize_flags_vertical = 3\nscript = ExtResource(\"1\")\n\n[node name=\"Title\" type=\"Label\" parent=\".\"]\nlayout_mode = 2\nsize_flags_vertical = 1\ntext = \"Leaderboards\"\nlabel_settings = ExtResource(\"2_6kpeu\")\n\n[node name=\"VB\" type=\"VBoxContainer\" parent=\".\"]\nlayout_mode = 2\ntheme_override_constants/separation = 8\n\n[node name=\"SelectLeaderboardBtn\" type=\"OptionButton\" parent=\"VB\"]\nunique_name_in_owner = true\nlayout_mode = 2\nsize_flags_horizontal = 0\n\n[node name=\"ViewLeaderboardBtn\" parent=\"VB\" instance=ExtResource(\"5\")]\nunique_name_in_owner = true\nlayout_mode = 2\nsize_flags_horizontal = 0\ntext = \"View\"\n\n[node name=\"LeaderboardId\" type=\"Label\" parent=\"VB\"]\nunique_name_in_owner = true\nlayout_mode = 2\ntheme_override_fonts/font = ExtResource(\"3\")\ntext = \"Leaderboard Id\"\n\n[node name=\"LeaderboardDataRichTextLabel\" type=\"RichTextLabel\" parent=\"VB\"]\nunique_name_in_owner = true\nlayout_mode = 2\ntheme_override_constants/table_h_separation = 16\ntheme_override_constants/table_v_separation = 4\ntheme_override_fonts/bold_font = ExtResource(\"3\")\ntheme_override_styles/focus = SubResource(\"StyleBoxEmpty_tgtn6\")\nbbcode_enabled = true\ntext = \"RankScoreUser\"\nfit_content = true\ncontext_menu_enabled = true\nselection_enabled = true\n"
  },
  {
    "path": "sample/scenes/LobbiesView/CreateLobbyPopup.gd",
    "content": "class_name CreateLobbyPopup\nextends StyledPopupWindow\n\n\n@onready var _bucket_id: LineEdit = %BucketId\n@onready var _map_option_btn: OptionButton = %MapOptionBtn\n@onready var _max_players_options_btn: OptionButton = %MaxPlayersOptionsBtn\n@onready var _public_check_box: CheckBox = %PublicCheckBox\n@onready var _allow_invites_check_box: CheckBox = %AllowInvitesCheckBox\n@onready var _presence_check_box: CheckBox = %PresenceCheckBox\n@onready var _rtc_voice_room_check_box: CheckBox = %RTCVoiceRoomCheckBox\n@onready var _create_lobby_btn: Button = %CreateLobbyBtn\n\n\nfunc _ready() -> void:\n\tsuper._ready()\n\t_populate_options_btns()\n\n\t_bucket_id.text_submitted.connect(func (_text): _on_create_lobby_btn_pressed())\n\t_create_lobby_btn.pressed.connect(_on_create_lobby_btn_pressed)\n\t_bucket_id.text_changed.connect(_on_bucket_id_text_changed)\n\n\tvisibility_changed.connect(_on_visibility_changed)\n\n\nfunc _populate_options_btns():\n\tvar map_names = LobbiesView.Maps.keys()\n\tfor i in range(map_names.size()):\n\t\t_map_option_btn.add_item(\"Map: \" + map_names[i])\n\t\t_map_option_btn.set_item_metadata(i, LobbiesView.Maps[map_names[i]])\n\n\tfor i in range(LobbiesView.MAX_PLAYERS):\n\t\t_max_players_options_btn.add_item(\"Max players: \" + str(i + 1), i)\n\t\t_max_players_options_btn.set_item_metadata(i, i + 1)\n\n\nfunc _on_create_lobby_btn_pressed():\n\tvar create_opts := EOS.Lobby.CreateLobbyOptions.new()\n\tcreate_opts.bucket_id = _bucket_id.text.strip_edges()\n\tcreate_opts.max_lobby_members = _max_players_options_btn.get_selected_metadata()\n\tcreate_opts.presence_enabled = _presence_check_box.button_pressed\n\tcreate_opts.enable_rtc_room = _rtc_voice_room_check_box.button_pressed\n\tcreate_opts.permission_level = EOS.Lobby.LobbyPermissionLevel.PublicAdvertised if _public_check_box.button_pressed else EOS.Lobby.LobbyPermissionLevel.InviteOnly\n\tcreate_opts.allow_invites = _allow_invites_check_box.button_pressed\n\tcreate_opts.local_rtc_options = {\n\t\tflags = EOS.RTC.JoinRoomFlags.EnableDataChannel\n\t}\n\n\t_create_lobby_btn.disabled = true\n\tvar lobby := await HLobbies.create_lobby_async(create_opts)\n\tif not lobby:\n\t\tprint(\"Failed to create lobby!\")\n\t\t_create_lobby_btn.disabled = false\n\t\treturn\n\n\n\tlobby.add_attribute(LobbiesView.MAP_ATTRIBUTE_KEY, LobbiesView.Maps.keys()[_map_option_btn.get_selected_metadata()])\n\tlobby.add_attribute(LobbiesView.OWNER_NAME_ATTRIBUTE_KEY, HAuth.display_name)\n\n\tlobby.add_current_member_attribute(LobbiesView.USERNAME_ATTRIBUTE_KEY, HAuth.display_name)\n\tlobby.add_current_member_attribute(LobbiesView.SKIN_ATTRIBUTE_KEY, Store.get_new_random(LobbiesView.Skins.values()))\n\t\n\tawait lobby.update_async()\n\n\t\n\tvar lobbies_view: LobbiesView = Store.get_view(\"Lobbies\")\n\tlobbies_view.set_current_lobby(lobby)\n\t_create_lobby_btn.disabled = false\n\thide()\n\n\nfunc _on_visibility_changed():\n\tif visible:\n\t\t_reset()\n\n\nfunc _reset():\n\t_bucket_id.text = \"battle_royale\"\n\t_create_lobby_btn.disabled = false\n\n\t_map_option_btn.select(0)\n\t_max_players_options_btn.select(3)\n\n\nfunc _on_bucket_id_text_changed(new_text: String):\n\tif new_text.strip_edges() != \"\":\n\t\t_create_lobby_btn.disabled = false\n\telse:\n\t\t_create_lobby_btn.disabled = true\n"
  },
  {
    "path": "sample/scenes/LobbiesView/CreateLobbyPopup.gd.uid",
    "content": "uid://csdajb1e07h18\n"
  },
  {
    "path": "sample/scenes/LobbiesView/CreateLobbyPopup.tscn",
    "content": "[gd_scene load_steps=4 format=3 uid=\"uid://bmxf7kdhjlip6\"]\n\n[ext_resource type=\"PackedScene\" uid=\"uid://dkprjbptror6n\" path=\"res://components/StyledPopupWindow/StyledPopupWindow.tscn\" id=\"1_dmoyl\"]\n[ext_resource type=\"PackedScene\" uid=\"uid://t8s6xh1ax7uy\" path=\"res://scenes/UI/PrimaryButton.tscn\" id=\"2_ngx7o\"]\n[ext_resource type=\"Script\" uid=\"uid://csdajb1e07h18\" path=\"res://scenes/LobbiesView/CreateLobbyPopup.gd\" id=\"2_oyj73\"]\n\n[node name=\"CreateLobbyPopup\" instance=ExtResource(\"1_dmoyl\")]\ntitle = \"CREATE LOBBY\"\nsize = Vector2i(356, 245)\nvisible = false\nscript = ExtResource(\"2_oyj73\")\n\n[node name=\"VB\" parent=\".\" index=\"1\"]\noffset_right = 352.0\noffset_bottom = 241.0\n\n[node name=\"Title\" parent=\"VB/PanelContainer/TitleBar\" index=\"0\"]\ntext = \"CREATE LOBBY\"\n\n[node name=\"BucketId\" type=\"LineEdit\" parent=\"VB/MC/VB\" index=\"0\"]\nunique_name_in_owner = true\nlayout_mode = 2\nplaceholder_text = \"Bucket Id\"\n\n[node name=\"HBoxContainer\" type=\"HBoxContainer\" parent=\"VB/MC/VB\" index=\"1\"]\nlayout_mode = 2\ntheme_override_constants/separation = 8\n\n[node name=\"MapOptionBtn\" type=\"OptionButton\" parent=\"VB/MC/VB/HBoxContainer\" index=\"0\"]\nunique_name_in_owner = true\ncustom_minimum_size = Vector2(150, 0)\nlayout_mode = 2\n\n[node name=\"MaxPlayersOptionsBtn\" type=\"OptionButton\" parent=\"VB/MC/VB/HBoxContainer\" index=\"1\"]\nunique_name_in_owner = true\ncustom_minimum_size = Vector2(150, 0)\nlayout_mode = 2\n\n[node name=\"HFlowContainer\" type=\"HFlowContainer\" parent=\"VB/MC/VB\" index=\"2\"]\nlayout_mode = 2\ntheme_override_constants/h_separation = 8\ntheme_override_constants/v_separation = 8\n\n[node name=\"PublicCheckBox\" type=\"CheckBox\" parent=\"VB/MC/VB/HFlowContainer\" index=\"0\"]\nunique_name_in_owner = true\nlayout_mode = 2\nmouse_default_cursor_shape = 2\nbutton_pressed = true\ntext = \"Public\"\n\n[node name=\"AllowInvitesCheckBox\" type=\"CheckBox\" parent=\"VB/MC/VB/HFlowContainer\" index=\"1\"]\nunique_name_in_owner = true\nlayout_mode = 2\nmouse_default_cursor_shape = 2\nbutton_pressed = true\ntext = \"Allow Invites\"\n\n[node name=\"PresenceCheckBox\" type=\"CheckBox\" parent=\"VB/MC/VB/HFlowContainer\" index=\"2\"]\nunique_name_in_owner = true\nlayout_mode = 2\nmouse_default_cursor_shape = 2\nbutton_pressed = true\ntext = \"Presence\"\n\n[node name=\"RTCVoiceRoomCheckBox\" type=\"CheckBox\" parent=\"VB/MC/VB/HFlowContainer\" index=\"3\"]\nunique_name_in_owner = true\nlayout_mode = 2\nmouse_default_cursor_shape = 2\nbutton_pressed = true\ntext = \"RTC Voice Room\"\n\n[node name=\"CreateLobbyBtn\" parent=\"VB/MC/VB\" index=\"3\" instance=ExtResource(\"2_ngx7o\")]\nunique_name_in_owner = true\nlayout_mode = 2\ntext = \"Create\"\n"
  },
  {
    "path": "sample/scenes/LobbiesView/CurrentLobby.gd",
    "content": "class_name CurrentLobby\nextends VBoxContainer\n\n@onready var id_label: LineEdit = %IdLabel\n@onready var owner_label: LineEdit = %OwnerLabel\n@onready var permission_label: LineEdit = %PermissionLabel\n@onready var map_label: LineEdit = %MapLabel\n@onready var members: GridContainer = %Members\n@onready var start_game_btn: Button = %StartGameBtn\n@onready var destroy_lobby_btn: Button = %DestroyLobbyBtn\n@onready var random_map_btn: Button = %RandomMapBtn\n@onready var leave_lobby_btn: Button = %LeaveLobbyBtn\n@onready var random_skin_btn: Button = %RandomSkinBtn\n@onready var toggle_mute_btn: Button = %MuteUnmuteBtn\n@onready var chat_history_label: RichTextLabel = %ChatHistoryLabel\n@onready var chat_msg_line_edit: LineEdit = %ChatMsgLineEdit\n@onready var send_chat_btn: Button = %SendChatBtn\n\n\nconst PRIMARY_BUTTON = preload(\"res://scenes/UI/PrimaryButton.tscn\")\n\nconst GRID_CONTAINER_LABELS_COUNT = 5\n\nvar cached_lobby := HLobby.new()\n\n\nenum RTCDataTypes {\n\tCHAT_MSG = 1,\n\tJOIN_GAME = 2,\n}\n\nfunc _ready() -> void:\n\tstart_game_btn.pressed.connect(_on_start_game_pressed)\n\tdestroy_lobby_btn.pressed.connect(_on_destroy_lobby_btn_pressed)\n\trandom_map_btn.pressed.connect(_on_random_map_btn_pressed)\n\tleave_lobby_btn.pressed.connect(_on_leave_lobby_btn_pressed)\n\trandom_skin_btn.pressed.connect(_on_random_skin_btn_pressed)\n\ttoggle_mute_btn.pressed.connect(_on_toggle_mute_btn_pressed)\n\tchat_msg_line_edit.text_submitted.connect(func (_text): _on_send_chat_btn_pressed())\n\tsend_chat_btn.pressed.connect(_on_send_chat_btn_pressed)\n\t\n\nfunc update(lobby: HLobby):\n\tcached_lobby = lobby\n\tStore.current_lobby = cached_lobby\n\t\n\tif cached_lobby.is_valid():\n\t\tif cached_lobby.is_owner():\n\t\t\tStore.network.create_server()\n\t\n\tcached_lobby.lobby_updated.connect(_update)\n\tcached_lobby.kicked_from_lobby.connect(func():\n\t\t_reset()\n\t\thide()\n\t)\n\tcached_lobby.rtc_data_received.connect(_on_rtc_data_received)\n\tcached_lobby.lobby_owner_changed.connect(func():\n\t\tif not cached_lobby.is_owner():\n\t\t\treturn\n\n\t\tvar mem = cached_lobby.get_owner()\n\t\tif not mem:\n\t\t\treturn\n\t\t\n\t\tvar username_attr = mem.get_attribute(LobbiesView.USERNAME_ATTRIBUTE_KEY)\n\t\tif not username_attr:\n\t\t\treturn\n\t\t\n\t\tlobby.add_attribute(LobbiesView.OWNER_NAME_ATTRIBUTE_KEY, username_attr.value)\n\t\tawait lobby.update_async()\n\t)\n\tchat_history_label.text = \"\"\n\t_update()\n\n\nfunc _reset():\n\tid_label.text = \"Id: ?\"\n\towner_label.text = \"Owner: ?\"\n\tpermission_label.text = \"Permission: ?\"\n\tmap_label.text = \"Map: ?\"\n\t_reset_lobby_members()\n\t_reset_buttons()\n\n\nfunc _reset_lobby_members():\n\tvar idx = members.get_child_count() - 1\n\twhile idx >= GRID_CONTAINER_LABELS_COUNT:\n\t\tvar node = members.get_child(idx)\n\t\tnode.queue_free()\n\t\tidx -= 1\n\n\nfunc _reset_buttons():\n\tstart_game_btn.hide()\n\tdestroy_lobby_btn.hide()\n\trandom_map_btn.hide()\n\tleave_lobby_btn.hide()\n\trandom_skin_btn.hide()\n\ttoggle_mute_btn.hide()\n\n\nfunc _update():\n\t_reset()\n\n\tif cached_lobby.is_valid():\n\t\tshow()\n\telse:\n\t\thide()\n\n\tif cached_lobby.lobby_id:\n\t\tid_label.text = \"Id: \" + cached_lobby.lobby_id\n\t\n\tif cached_lobby.owner_product_user_id:\n\t\tvar lobby_owner := cached_lobby.get_owner()\n\t\tvar owner_name_attr = cached_lobby.get_attribute(LobbiesView.OWNER_NAME_ATTRIBUTE_KEY)\n\t\tvar owner_name = \"\"\n\t\tif owner_name_attr:\n\t\t\towner_name = owner_name_attr.value\n\t\telif lobby_owner and lobby_owner.display_name:\n\t\t\towner_name = lobby_owner.display_name\n\t\towner_label.text = \"Owner: %s(%s)\" % [owner_name, cached_lobby.owner_product_user_id]\n\n\t# Lobby permission level\n\tvar perm = \"Public\"\n\tif cached_lobby.permission_level == EOS.Lobby.LobbyPermissionLevel.JoinViaPresence:\n\t\tperm = \"JoinViaPresence\"\n\telif cached_lobby.permission_level == EOS.Lobby.LobbyPermissionLevel.InviteOnly:\n\t\tperm = \"InviteOnly\"\n\tpermission_label.text = \"Permission: \" + perm\n\n\t# Lobby Attr: Map\n\tvar map_attr = cached_lobby.get_attribute(LobbiesView.MAP_ATTRIBUTE_KEY)\n\tif map_attr:\n\t\tmap_label.text = \"Map: \" + map_attr.value\n\n\t# Lobby members\n\t_update_lobby_members()\n\t\n\t# Buttons\n\t_update_buttons()\n\n\nfunc _update_lobby_members():\n\tvar connected_members = 0\n\tfor mem in cached_lobby.members:\n\t\tif mem.rtc_state.is_in_rtc_room:\n\t\t\tconnected_members += 1\n\n\tfor mem in cached_lobby.members:\n\t\tvar name_label = Label.new()\n\t\t\n\t\tvar display_name_attr = mem.get_attribute(LobbiesView.USERNAME_ATTRIBUTE_KEY)\n\t\tvar mem_name = \"User %d\" % randi_range(1000, 9999)\n\t\tif display_name_attr:\n\t\t\tmem_name = display_name_attr.value\n\t\tif not mem_name:\n\t\t\tmem_name = \"User\"\n\t\tname_label.text = \"%s\" % [mem_name]\n\t\tmembers.add_child(name_label)\n\n\t\tvar is_owner_label = Label.new()\n\t\tis_owner_label.text = \"Owner\" if cached_lobby.is_owner(mem.product_user_id) else \"Member\"\n\t\tmembers.add_child(is_owner_label)\n\n\t\tvar skin_label = Label.new()\n\t\tskin_label.text = \"?\"\n\t\tvar skin_attr = mem.get_attribute(LobbiesView.SKIN_ATTRIBUTE_KEY)\n\t\tif skin_attr:\n\t\t\tskin_label.text = skin_attr.value\n\t\tmembers.add_child(skin_label)\n\t\t\n\t\tvar talking_status = \"Unknown\"\n\t\tvar text_color = Color.DARK_GRAY\n\t\tif not cached_lobby.rtc_room_enabled:\n\t\t\ttalking_status = \"RTC Disabled\"\n\t\telse:\n\t\t\tif not mem.rtc_state.is_in_rtc_room:\n\t\t\t\ttalking_status = \"Disconnected\"\n\t\t\telif mem.rtc_state.is_hard_muted:\n\t\t\t\ttalking_status = \"Hard Muted\"\n\t\t\t\ttext_color = Color.RED\n\t\t\telif mem.rtc_state.is_locally_muted:\n\t\t\t\ttalking_status = \"Muted\"\n\t\t\t\ttext_color = Color.RED\n\t\t\telif mem.rtc_state.is_audio_output_disabled:\n\t\t\t\ttalking_status = \"Self muted\"\n\t\t\t\ttext_color = Color.DARK_RED\n\t\t\telif mem.rtc_state.is_talking:\n\t\t\t\ttalking_status = \"Talking\"\n\t\t\t\ttext_color = Color.GREEN\n\t\t\telif connected_members < 2:\n\t\t\t\ttalking_status = \"Connected\"\n\t\t\t\ttext_color = Color.WHITE\n\t\t\telse:\n\t\t\t\ttalking_status = \"Not Talking\"\n\t\t\t\ttext_color = Color.YELLOW\n\n\t\tvar talking_node = Label.new()\n\t\ttalking_node.text = talking_status\n\t\ttalking_node.modulate = text_color\n\t\tmembers.add_child(talking_node)\n\n\t\tvar actions_container = GridContainer.new()\n\t\tactions_container.columns = 2\n\t\t\n\t\tif cached_lobby.is_owner() and not mem.is_self():\n\t\t\tif not mem.is_owner():\n\t\t\t\t# Can promote\n\t\t\t\tvar promote_btn = PRIMARY_BUTTON.instantiate()\n\t\t\t\tpromote_btn.text = \"Promote\"\n\t\t\t\tpromote_btn.pressed.connect(_on_promote_btn_pressed.bind(mem))\n\t\t\t\tactions_container.add_child(promote_btn)\n\t\t\t\n\t\t\t# Can kick\n\t\t\tvar kick_btn = PRIMARY_BUTTON.instantiate()\n\t\t\tkick_btn.text = \"Kick\"\n\t\t\tkick_btn.pressed.connect(_on_kick_btn_pressed.bind(mem))\n\t\t\tactions_container.add_child(kick_btn)\n\n\t\t\t# Can toggle hard-mute\n\t\t\tvar toggle_hardmute_btn = PRIMARY_BUTTON.instantiate()\n\t\t\tif mem.is_hard_muted():\n\t\t\t\ttoggle_hardmute_btn.text = \"Un hard-mute\"\n\t\t\telse:\n\t\t\t\ttoggle_hardmute_btn.text = \"Hard-mute\"\n\t\t\ttoggle_hardmute_btn.pressed.connect(_on_toggle_hard_mute_btn_pressed.bind(mem))\n\t\t\tactions_container.add_child(toggle_hardmute_btn)\n\t\t\t\t\n\t\tmembers.add_child(actions_container)\n\n\nfunc _update_buttons():\n\tif not cached_lobby.is_valid():\n\t\treturn\n\t\t\n\n\tif cached_lobby.is_owner():\n\t\tstart_game_btn.show()\n\t\tdestroy_lobby_btn.show()\n\t\trandom_map_btn.show()\n\n\tleave_lobby_btn.show()\n\trandom_skin_btn.show()\n\tif cached_lobby.rtc_room_enabled:\n\t\ttoggle_mute_btn.show()\n\t\n\tif cached_lobby and cached_lobby.get_current_member():\n\t\ttoggle_mute_btn.text = \"Unmute\" if cached_lobby.get_current_member().is_muted() else \"Mute\"\n\n\nfunc _on_leave_lobby_btn_pressed():\n\tvar success = await cached_lobby.leave_async()\n\tif not success:\n\t\tprint(\"failed to leave lobby\")\n\t\treturn\n\tupdate(HLobby.new())\n\n\nfunc _on_start_game_pressed():\n\tvar map_attr = cached_lobby.get_attribute(LobbiesView.MAP_ATTRIBUTE_KEY)\n\t\n\t# Update the lobby so it doesnt show in searches\n\tcached_lobby.permission_level = EOS.Lobby.LobbyPermissionLevel.InviteOnly\n\tawait cached_lobby.update_async()\n\t\n\tStore.network.start_game(LobbiesView.Maps.get(map_attr.value))\n\t\n\tvar data = _make_join_game_data()\n\tvar ret := cached_lobby.rtc_send_data(data)\n\tif not ret:\n\t\tprint(\"failed to send join game msg\")\n\t\treturn\n\n\n\nfunc _on_destroy_lobby_btn_pressed():\n\tvar success = await cached_lobby.destroy_async()\n\tif not success:\n\t\tprint(\"failed to destroy lobby\")\n\t\treturn\n\n\nfunc _on_random_skin_btn_pressed():\n\tvar skin_attr = cached_lobby.get_current_member_attribute(LobbiesView.SKIN_ATTRIBUTE_KEY)\n\tvar current_skin = skin_attr.get(\"value\", null)\n\tcached_lobby.add_current_member_attribute(LobbiesView.SKIN_ATTRIBUTE_KEY, Store.get_new_random(LobbiesView.Skins.values(), current_skin))\n\tawait cached_lobby.update_async()\n\n\nfunc _on_random_map_btn_pressed():\n\tvar map_attr = cached_lobby.get_current_member_attribute(LobbiesView.MAP_ATTRIBUTE_KEY)\n\tvar current_map = map_attr.get(\"value\", null)\n\tcached_lobby.add_attribute(LobbiesView.MAP_ATTRIBUTE_KEY, Store.get_new_random(LobbiesView.Maps.keys(), current_map))\n\tawait cached_lobby.update_async()\n\n\nfunc _on_toggle_mute_btn_pressed():\n\tvar mem = cached_lobby.get_current_member()\n\tif not mem:\n\t\tprint(\"failed to get member\")\n\t\treturn\n\t\n\tvar success := await mem.toggle_mute_member_async()\n\tif not success:\n\t\tprint(\"mute/unmute failed\")\n\n\nfunc _on_promote_btn_pressed(mem: HLobbyMember):\n\tvar success := await mem.promote_member_async()\n\tif not success:\n\t\tprint(\"failed to promote member\")\n\t\treturn\n\nfunc _on_kick_btn_pressed(mem: HLobbyMember):\n\tvar success := await mem.kick_member_async()\n\tif not success:\n\t\tprint(\"failed to kick member\")\n\t\treturn\n\nfunc _on_toggle_hard_mute_btn_pressed(mem: HLobbyMember):\n\tvar success := await mem.toggle_hard_mute_member_async()\n\tif not success:\n\t\tprint(\"failed to toggle member hard mute\")\n\t\treturn\n\t\n\nfunc _on_rtc_data_received(raw_data: PackedByteArray):\n\t# We know we will get a Variant\n\t# because thats what we send\n\tvar data = bytes_to_var(raw_data)\n\t\n\tif not (typeof(data) == TYPE_DICTIONARY and data.t):\n\t\tprint(\"Got invalid rtc data\")\n\t\treturn\n\t\n\tvar msg_type = data.t\n\t\n\tif msg_type == RTCDataTypes.CHAT_MSG:\n\t\tchat_history_label.set_text.call_deferred(chat_history_label.text + data.u + \": \" + data.m + \"\\n\")\n\tif msg_type == RTCDataTypes.JOIN_GAME:\n\t\tif cached_lobby.is_valid() and not cached_lobby.is_owner():\n\t\t\tStore.network.join_game.call_deferred(cached_lobby.owner_product_user_id)\n\n\nfunc _make_chat_message_data(username: String, msg: String):\n\treturn {\n\t\tt = RTCDataTypes.CHAT_MSG, \n\t\tu = username,\n\t\tm = msg\n\t}\n\n\nfunc _make_join_game_data():\n\treturn {\n\t\tt = RTCDataTypes.JOIN_GAME, \n\t}\n\n\nfunc _on_send_chat_btn_pressed():\n\tvar text = chat_msg_line_edit.text.strip_edges()\n\tif not text:\n\t\treturn\n\t\n\tvar mem = cached_lobby.get_current_member()\n\tvar username_attr = mem.get_attribute(LobbiesView.USERNAME_ATTRIBUTE_KEY)\n\tvar username = \"User\"\n\tif username_attr and username_attr.value:\n\t\tusername = username_attr.value\n\t\n\tvar data = _make_chat_message_data(username, text)\n\tvar ret := cached_lobby.rtc_send_data(data)\n\tif not ret:\n\t\tprint(\"failed to send chat msg\")\n\t\treturn\n\t\n\tchat_history_label.text += username + \": \" + text + \"\\n\"\n"
  },
  {
    "path": "sample/scenes/LobbiesView/CurrentLobby.gd.uid",
    "content": "uid://dscovu6epeb5t\n"
  },
  {
    "path": "sample/scenes/LobbiesView/LobbiesView.gd",
    "content": "class_name LobbiesView\nextends VBoxContainer\n\n\nenum Maps {\n\tMargao,\n\tBellandur,\n\tNewYork,\n}\n\nconst Skins = {\n\tHuman = \"Human\",\n\tRobot = \"Robot\",\n\tCyborg = \"Cyborg\",\n\tAlien = \"Alien\",\n\tMartian = \"Martian\",\n\tWerewolf = \"Werewolf\"\n}\n\nconst MAX_PLAYERS = 6\nconst MAP_ATTRIBUTE_KEY = \"LEVEL\" # To match with EOS Lobbies sample\nconst SKIN_ATTRIBUTE_KEY = \"SKIN\"\nconst OWNER_NAME_ATTRIBUTE_KEY = \"OWNER_NAME\"\nconst USERNAME_ATTRIBUTE_KEY = \"USER_NAME\"\n\nvar current_lobby: HLobby\n\n@onready var show_create_lobby_btn = %ShowCreateLobbyBtn\n@onready var create_lobby_popup = %CreateLobbyPopup\n\n@onready var search_lobby_type = %SearchLobbyType\n@onready var search_lobby_line_edit = %SearchLobbyLineEdit\n@onready var search_lobby_btn = %SearchLobbyBtn\n\n@onready var current_lobby_node: CurrentLobby = %CurrentLobby\n@onready var search_lobby_results: SearchLobbyResults = %SearchLobbyResults\n\n\nfunc _ready() -> void:\n\tshow_create_lobby_btn.pressed.connect(_on_show_create_lobby_btn_pressed)\n\tcurrent_lobby = HLobby.new()\n\t\n\thide()\n\n\thide_search_results()\n\thide_current_lobby()\n\n\nfunc set_current_lobby(lobby: HLobby):\n\tcurrent_lobby = lobby\n\tcurrent_lobby_node.update(current_lobby)\n\n\nfunc hide_current_lobby():\n\tcurrent_lobby_node.hide()\n\n\nfunc handle_search_results(search_results: Array[HLobby]):\n\thide_current_lobby()\n\tsearch_lobby_results.show()\n\tsearch_lobby_results.update_results(search_results)\n\n\nfunc hide_search_results():\n\tsearch_lobby_results.hide()\n\tif current_lobby.is_valid():\n\t\tcurrent_lobby_node.show()\n\n\nfunc _on_show_create_lobby_btn_pressed():\n\tcreate_lobby_popup.popup_centered()\n"
  },
  {
    "path": "sample/scenes/LobbiesView/LobbiesView.gd.uid",
    "content": "uid://c3mc2b4nqvb5v\n"
  },
  {
    "path": "sample/scenes/LobbiesView/LobbiesView.tscn",
    "content": "[gd_scene load_steps=11 format=3 uid=\"uid://dsiyt23hnmngd\"]\n\n[ext_resource type=\"Script\" uid=\"uid://c3mc2b4nqvb5v\" path=\"res://scenes/LobbiesView/LobbiesView.gd\" id=\"1_gvnj5\"]\n[ext_resource type=\"LabelSettings\" uid=\"uid://dcb771ib3tfno\" path=\"res://styles/ViewTitleLabelSettings.tres\" id=\"2_guetp\"]\n[ext_resource type=\"Script\" uid=\"uid://bjqvw2f6qq5vu\" path=\"res://scenes/LobbiesView/SearchLobby.gd\" id=\"4_pnhqb\"]\n[ext_resource type=\"FontFile\" uid=\"uid://djdr1hyqtgka6\" path=\"res://fonts/Roboto-Bold.ttf\" id=\"4_vb7hx\"]\n[ext_resource type=\"Script\" uid=\"uid://dscovu6epeb5t\" path=\"res://scenes/LobbiesView/CurrentLobby.gd\" id=\"5_u3fs3\"]\n[ext_resource type=\"Script\" uid=\"uid://c42grjipjn5g0\" path=\"res://scenes/LobbiesView/SearchLobbyResults.gd\" id=\"6_myvks\"]\n[ext_resource type=\"PackedScene\" uid=\"uid://t8s6xh1ax7uy\" path=\"res://scenes/UI/PrimaryButton.tscn\" id=\"6_uc41g\"]\n[ext_resource type=\"PackedScene\" uid=\"uid://bmxf7kdhjlip6\" path=\"res://scenes/LobbiesView/CreateLobbyPopup.tscn\" id=\"8_a8tgx\"]\n\n[sub_resource type=\"StyleBoxFlat\" id=\"StyleBoxFlat_6m7w5\"]\ncontent_margin_left = 4.0\ncontent_margin_top = 4.0\ncontent_margin_right = 4.0\ncontent_margin_bottom = 4.0\nbg_color = Color(0.2, 0.2, 0.2, 1)\ncorner_radius_top_left = 4\ncorner_radius_top_right = 4\ncorner_radius_bottom_right = 4\ncorner_radius_bottom_left = 4\n\n[sub_resource type=\"StyleBoxFlat\" id=\"StyleBoxFlat_2qkjk\"]\nbg_color = Color(0.0417444, 0.0824518, 0.193368, 1)\n\n[node name=\"LobbiesView\" type=\"VBoxContainer\"]\nanchors_preset = 15\nanchor_right = 1.0\nanchor_bottom = 1.0\nsize_flags_horizontal = 3\nsize_flags_vertical = 3\nscript = ExtResource(\"1_gvnj5\")\n\n[node name=\"Title\" type=\"Label\" parent=\".\"]\nlayout_mode = 2\nsize_flags_vertical = 1\ntext = \"Lobbies\"\nlabel_settings = ExtResource(\"2_guetp\")\n\n[node name=\"VB\" type=\"VBoxContainer\" parent=\".\"]\nlayout_mode = 2\nsize_flags_vertical = 3\ntheme_override_constants/separation = 8\n\n[node name=\"HBoxContainer\" type=\"HBoxContainer\" parent=\"VB\"]\nlayout_mode = 2\n\n[node name=\"ShowCreateLobbyBtn\" parent=\"VB/HBoxContainer\" instance=ExtResource(\"6_uc41g\")]\nunique_name_in_owner = true\nlayout_mode = 2\ntext = \"Create Lobby\"\n\n[node name=\"PanelContainer\" type=\"PanelContainer\" parent=\"VB/HBoxContainer\"]\nlayout_mode = 2\nsize_flags_horizontal = 10\ntheme_override_styles/panel = SubResource(\"StyleBoxFlat_6m7w5\")\n\n[node name=\"SearchLobby\" type=\"HBoxContainer\" parent=\"VB/HBoxContainer/PanelContainer\"]\nlayout_mode = 2\nscript = ExtResource(\"4_pnhqb\")\n\n[node name=\"SearchLobbyType\" type=\"OptionButton\" parent=\"VB/HBoxContainer/PanelContainer/SearchLobby\"]\nunique_name_in_owner = true\ncustom_minimum_size = Vector2(200, 0)\nlayout_mode = 2\n\n[node name=\"SearchLobbyLineEdit\" type=\"LineEdit\" parent=\"VB/HBoxContainer/PanelContainer/SearchLobby\"]\nunique_name_in_owner = true\ncustom_minimum_size = Vector2(150, 0)\nlayout_mode = 2\nplaceholder_text = \"Search string\"\n\n[node name=\"SearchLobbyBtn\" parent=\"VB/HBoxContainer/PanelContainer/SearchLobby\" instance=ExtResource(\"6_uc41g\")]\nunique_name_in_owner = true\nlayout_mode = 2\ntext = \"Search\"\n\n[node name=\"ClearSearchLobbyBtn\" parent=\"VB/HBoxContainer/PanelContainer/SearchLobby\" instance=ExtResource(\"6_uc41g\")]\nunique_name_in_owner = true\nlayout_mode = 2\ndisabled = true\ntext = \"Clear\"\n\n[node name=\"HSeparator\" type=\"HSeparator\" parent=\"VB\"]\nlayout_mode = 2\ntheme_override_constants/separation = 16\n\n[node name=\"CurrentLobby\" type=\"VBoxContainer\" parent=\"VB\"]\nunique_name_in_owner = true\nlayout_mode = 2\nsize_flags_vertical = 3\nscript = ExtResource(\"5_u3fs3\")\n\n[node name=\"MarginContainer\" type=\"MarginContainer\" parent=\"VB/CurrentLobby\"]\nlayout_mode = 2\ntheme_override_constants/margin_left = 12\ntheme_override_constants/margin_right = 12\n\n[node name=\"Columns\" type=\"HBoxContainer\" parent=\"VB/CurrentLobby/MarginContainer\"]\nlayout_mode = 2\nsize_flags_vertical = 3\n\n[node name=\"LeftColumn\" type=\"VBoxContainer\" parent=\"VB/CurrentLobby/MarginContainer/Columns\"]\nlayout_mode = 2\nsize_flags_horizontal = 3\n\n[node name=\"Label\" type=\"Label\" parent=\"VB/CurrentLobby/MarginContainer/Columns/LeftColumn\"]\nlayout_mode = 2\ntheme_override_fonts/font = ExtResource(\"4_vb7hx\")\ntext = \"MY LOBBY\"\n\n[node name=\"HBoxContainer\" type=\"HBoxContainer\" parent=\"VB/CurrentLobby/MarginContainer/Columns/LeftColumn\"]\nlayout_mode = 2\ntheme_override_constants/separation = 32\n\n[node name=\"IdLabel\" type=\"LineEdit\" parent=\"VB/CurrentLobby/MarginContainer/Columns/LeftColumn/HBoxContainer\"]\nunique_name_in_owner = true\ncustom_minimum_size = Vector2(200, 0)\nlayout_mode = 2\ntext = \"Id: ?\"\neditable = false\n\n[node name=\"OwnerLabel\" type=\"LineEdit\" parent=\"VB/CurrentLobby/MarginContainer/Columns/LeftColumn/HBoxContainer\"]\nunique_name_in_owner = true\ncustom_minimum_size = Vector2(200, 0)\nlayout_mode = 2\ntext = \"Owner: ?\"\neditable = false\n\n[node name=\"HBoxContainer2\" type=\"HBoxContainer\" parent=\"VB/CurrentLobby/MarginContainer/Columns/LeftColumn\"]\nlayout_mode = 2\ntheme_override_constants/separation = 32\n\n[node name=\"PermissionLabel\" type=\"LineEdit\" parent=\"VB/CurrentLobby/MarginContainer/Columns/LeftColumn/HBoxContainer2\"]\nunique_name_in_owner = true\ncustom_minimum_size = Vector2(200, 0)\nlayout_mode = 2\ntext = \"Permission: ?\"\neditable = false\n\n[node name=\"MapLabel\" type=\"LineEdit\" parent=\"VB/CurrentLobby/MarginContainer/Columns/LeftColumn/HBoxContainer2\"]\nunique_name_in_owner = true\ncustom_minimum_size = Vector2(200, 0)\nlayout_mode = 2\ntext = \"Map: ?\"\neditable = false\n\n[node name=\"MarginContainer\" type=\"MarginContainer\" parent=\"VB/CurrentLobby/MarginContainer/Columns/LeftColumn\"]\nlayout_mode = 2\ntheme_override_constants/margin_left = 0\ntheme_override_constants/margin_top = 12\ntheme_override_constants/margin_right = 0\ntheme_override_constants/margin_bottom = 0\n\n[node name=\"HBoxContainer\" type=\"HBoxContainer\" parent=\"VB/CurrentLobby/MarginContainer/Columns/LeftColumn/MarginContainer\"]\nlayout_mode = 2\n\n[node name=\"StartGameBtn\" parent=\"VB/CurrentLobby/MarginContainer/Columns/LeftColumn/MarginContainer/HBoxContainer\" instance=ExtResource(\"6_uc41g\")]\nunique_name_in_owner = true\nlayout_mode = 2\ntext = \"Start\"\n\n[node name=\"DestroyLobbyBtn\" parent=\"VB/CurrentLobby/MarginContainer/Columns/LeftColumn/MarginContainer/HBoxContainer\" instance=ExtResource(\"6_uc41g\")]\nunique_name_in_owner = true\nlayout_mode = 2\ntext = \"Destroy\"\n\n[node name=\"RandomMapBtn\" parent=\"VB/CurrentLobby/MarginContainer/Columns/LeftColumn/MarginContainer/HBoxContainer\" instance=ExtResource(\"6_uc41g\")]\nunique_name_in_owner = true\nlayout_mode = 2\ntext = \"Random Map\"\n\n[node name=\"VSeparator\" type=\"VSeparator\" parent=\"VB/CurrentLobby/MarginContainer/Columns/LeftColumn/MarginContainer/HBoxContainer\"]\nlayout_mode = 2\ntheme_override_constants/separation = 12\n\n[node name=\"LeaveLobbyBtn\" parent=\"VB/CurrentLobby/MarginContainer/Columns/LeftColumn/MarginContainer/HBoxContainer\" instance=ExtResource(\"6_uc41g\")]\nunique_name_in_owner = true\nlayout_mode = 2\ntext = \"Leave\"\n\n[node name=\"RandomSkinBtn\" parent=\"VB/CurrentLobby/MarginContainer/Columns/LeftColumn/MarginContainer/HBoxContainer\" instance=ExtResource(\"6_uc41g\")]\nunique_name_in_owner = true\nlayout_mode = 2\ntext = \"Random skin\"\n\n[node name=\"MuteUnmuteBtn\" parent=\"VB/CurrentLobby/MarginContainer/Columns/LeftColumn/MarginContainer/HBoxContainer\" instance=ExtResource(\"6_uc41g\")]\nunique_name_in_owner = true\nlayout_mode = 2\ntext = \"Mute\"\n\n[node name=\"Label2\" type=\"Label\" parent=\"VB/CurrentLobby/MarginContainer/Columns/LeftColumn\"]\ncustom_minimum_size = Vector2(0, 48)\nlayout_mode = 2\ntheme_override_fonts/font = ExtResource(\"4_vb7hx\")\ntext = \"Members\"\nvertical_alignment = 2\n\n[node name=\"Members\" type=\"GridContainer\" parent=\"VB/CurrentLobby/MarginContainer/Columns/LeftColumn\"]\nunique_name_in_owner = true\nlayout_mode = 2\ntheme_override_constants/h_separation = 64\ncolumns = 5\n\n[node name=\"Name\" type=\"Label\" parent=\"VB/CurrentLobby/MarginContainer/Columns/LeftColumn/Members\"]\nlayout_mode = 2\ntext = \"Name\"\n\n[node name=\"IsOwner\" type=\"Label\" parent=\"VB/CurrentLobby/MarginContainer/Columns/LeftColumn/Members\"]\nlayout_mode = 2\ntext = \"Is Owner?\"\n\n[node name=\"Skin\" type=\"Label\" parent=\"VB/CurrentLobby/MarginContainer/Columns/LeftColumn/Members\"]\nlayout_mode = 2\ntext = \"Skin\"\n\n[node name=\"Talking\" type=\"Label\" parent=\"VB/CurrentLobby/MarginContainer/Columns/LeftColumn/Members\"]\nlayout_mode = 2\ntext = \"Talking?\"\n\n[node name=\"Actions\" type=\"Label\" parent=\"VB/CurrentLobby/MarginContainer/Columns/LeftColumn/Members\"]\nlayout_mode = 2\n\n[node name=\"RightColumn\" type=\"VBoxContainer\" parent=\"VB/CurrentLobby/MarginContainer/Columns\"]\ncustom_minimum_size = Vector2(300, 0)\nlayout_mode = 2\n\n[node name=\"Label\" type=\"Label\" parent=\"VB/CurrentLobby/MarginContainer/Columns/RightColumn\"]\nlayout_mode = 2\ntheme_override_fonts/font = ExtResource(\"4_vb7hx\")\ntext = \"CHAT\"\n\n[node name=\"ChatHistoryLabel\" type=\"RichTextLabel\" parent=\"VB/CurrentLobby/MarginContainer/Columns/RightColumn\"]\nunique_name_in_owner = true\nlayout_mode = 2\nsize_flags_vertical = 3\ntheme_override_styles/normal = SubResource(\"StyleBoxFlat_2qkjk\")\nscroll_following = true\n\n[node name=\"HBoxContainer\" type=\"HBoxContainer\" parent=\"VB/CurrentLobby/MarginContainer/Columns/RightColumn\"]\nlayout_mode = 2\ntheme_override_constants/separation = 6\n\n[node name=\"ChatMsgLineEdit\" type=\"LineEdit\" parent=\"VB/CurrentLobby/MarginContainer/Columns/RightColumn/HBoxContainer\"]\nunique_name_in_owner = true\nlayout_mode = 2\nsize_flags_horizontal = 3\n\n[node name=\"SendChatBtn\" parent=\"VB/CurrentLobby/MarginContainer/Columns/RightColumn/HBoxContainer\" instance=ExtResource(\"6_uc41g\")]\nunique_name_in_owner = true\nlayout_mode = 2\ntext = \"Send\"\n\n[node name=\"SearchLobbyResults\" type=\"VBoxContainer\" parent=\"VB\"]\nunique_name_in_owner = true\nvisible = false\nlayout_mode = 2\nscript = ExtResource(\"6_myvks\")\n\n[node name=\"Label2\" type=\"Label\" parent=\"VB/SearchLobbyResults\"]\nlayout_mode = 2\ntheme_override_fonts/font = ExtResource(\"4_vb7hx\")\ntext = \"SEARCH RESULTS\"\n\n[node name=\"GridContainer\" type=\"GridContainer\" parent=\"VB/SearchLobbyResults\"]\nunique_name_in_owner = true\nlayout_mode = 2\ntheme_override_constants/h_separation = 64\ncolumns = 4\n\n[node name=\"OwnerName\" type=\"Label\" parent=\"VB/SearchLobbyResults/GridContainer\"]\nlayout_mode = 2\ntheme_override_fonts/font = ExtResource(\"4_vb7hx\")\ntext = \"Owner\"\n\n[node name=\"Members\" type=\"Label\" parent=\"VB/SearchLobbyResults/GridContainer\"]\nlayout_mode = 2\ntheme_override_fonts/font = ExtResource(\"4_vb7hx\")\ntext = \"Members\"\n\n[node name=\"Map\" type=\"Label\" parent=\"VB/SearchLobbyResults/GridContainer\"]\nlayout_mode = 2\ntheme_override_fonts/font = ExtResource(\"4_vb7hx\")\ntext = \"Map\"\n\n[node name=\"JoinBtn\" type=\"Label\" parent=\"VB/SearchLobbyResults/GridContainer\"]\nlayout_mode = 2\n\n[node name=\"CreateLobbyPopup\" parent=\".\" instance=ExtResource(\"8_a8tgx\")]\nunique_name_in_owner = true\n"
  },
  {
    "path": "sample/scenes/LobbiesView/SearchLobby.gd",
    "content": "extends HBoxContainer\n\n#region Enums\n\nconst SearchType = {\n\tMap = \"Map\",\n\tBucketId = \"BucketId\",\n\tLobbyId = \"LobbyId\",\n\tUserId = \"UserId\",\n}\n\n#endregion\n\n\n#region Onready vars\n\n@onready var search_lobby_type: OptionButton = %SearchLobbyType\n@onready var search_lobby_line_edit: LineEdit = %SearchLobbyLineEdit\n@onready var search_lobby_btn: Button = %SearchLobbyBtn\n@onready var clear_search_lobby_btn: Button = %ClearSearchLobbyBtn\n\n#endregion\n\n\n#region Built-in methods\n\nfunc _ready() -> void:\n\tsearch_lobby_btn.pressed.connect(_on_search_lobby_btn_pressed)\n\tsearch_lobby_line_edit.text_changed.connect(_on_search_lobby_line_edit_text_changed)\n\tsearch_lobby_line_edit.text_submitted.connect(func(_new_text): _on_search_lobby_btn_pressed())\n\tclear_search_lobby_btn.pressed.connect(_on_clear_search_lobby_btn_pressed)\n\n\t_populate_search_lobby_type_options()\n\n#endregion\n\n\n#region Private methods\n\nfunc _populate_search_lobby_type_options():\n\tvar idx = 0\n\tfor search_type in SearchType.keys():\n\t\tsearch_lobby_type.add_item(search_type, idx)\n\t\tsearch_lobby_type.set_item_metadata(idx, search_type)\n\t\tidx += 1\n\n\nfunc _on_search_lobby_btn_pressed():\n\tvar search_type = search_lobby_type.get_selected_metadata()\n\tvar search_string = search_lobby_line_edit.text.strip_edges()\n\n\tvar lobbies = []\n\tif search_type == SearchType.Map:\n\t\tif search_string.is_empty():\n\t\t\t# Search for any map\n\t\t\tlobbies = await HLobbies.search_by_attribute_async({\n\t\t\t\tkey = LobbiesView.MAP_ATTRIBUTE_KEY, value = search_string, comparison = EOS.ComparisonOp.NotEqual\n\t\t\t})\n\t\telse:\n\t\t\t# Search for specific map\n\t\t\tlobbies = await HLobbies.search_by_attribute_async({\n\t\t\t\tkey = LobbiesView.MAP_ATTRIBUTE_KEY, value = search_string, comparison = EOS.ComparisonOp.Equal\n\t\t\t})\n\telif search_type == SearchType.BucketId:\n\t\tlobbies = await HLobbies.search_by_bucket_id_async(search_string)\n\telif search_type == SearchType.LobbyId:\n\t\tlobbies = await HLobbies.search_by_lobby_id_async(search_string)\n\telif search_type == SearchType.UserId:\n\t\tlobbies = await HLobbies.search_by_product_user_id_async(search_string)\n\telse:\n\t\tprint(\"Invalid lobby search type\")\n\t\treturn\n\n\tif lobbies == null:\n\t\tprint(\"Failed to search for lobbies\")\n\t\treturn\n\t\n\tvar lobbies_view: LobbiesView = Store.get_view(\"Lobbies\")\n\tlobbies_view.handle_search_results(lobbies)\n\n\nfunc _on_clear_search_lobby_btn_pressed():\n\tsearch_lobby_line_edit.text = \"\"\n\tvar lobbies_view: LobbiesView = Store.get_view(\"Lobbies\")\n\tlobbies_view.handle_search_results([])\n\tlobbies_view.hide_search_results()\n\n\nfunc _on_search_lobby_line_edit_text_changed(_new_text: String):\n\tsearch_lobby_btn.disabled = false\n\tclear_search_lobby_btn.disabled = false\n\n#endregion\n"
  },
  {
    "path": "sample/scenes/LobbiesView/SearchLobby.gd.uid",
    "content": "uid://bjqvw2f6qq5vu\n"
  },
  {
    "path": "sample/scenes/LobbiesView/SearchLobbyResults.gd",
    "content": "class_name SearchLobbyResults\nextends VBoxContainer\n\nconst GRID_CONTAINER_LABELS_COUNT = 4\n\n\nvar search_results: Array[HLobby] = []\n\n\n@onready var grid: GridContainer = %GridContainer\n@onready var PrimaryButton = preload(\"res://scenes/UI/PrimaryButton.tscn\")\n\n\nfunc update_results(p_search_results: Array[HLobby]):\n\tsearch_results = p_search_results\n\tupdate_ui()\n\n\nfunc update_ui():\n\t_reset()\n\n\tfor lobby in search_results:\n\t\tvar owner_name_attr = lobby.get_attribute(LobbiesView.OWNER_NAME_ATTRIBUTE_KEY)\n\t\tvar owner_label = Label.new()\n\t\tvar owner_name = \"?\"\n\t\tif owner_name_attr:\n\t\t\towner_name = owner_name_attr.value\n\t\towner_label.text = \"%s(%s)\" % [owner_name, lobby.owner_product_user_id]\n\t\tgrid.add_child(owner_label)\n\n\t\tvar members_label = Label.new()\n\t\tmembers_label.text = \"%s/%s\" % [lobby.members.size(), lobby.max_members]\n\t\tgrid.add_child(members_label)\n\n\t\tvar map_attr = lobby.get_attribute(LobbiesView.MAP_ATTRIBUTE_KEY)\n\t\tvar map_label = Label.new()\n\t\tmap_label.text = \"?\"\n\t\tif map_attr:\n\t\t\tmap_label.text = map_attr.value\n\t\tgrid.add_child(map_label)\n\n\t\tvar join_btn = PrimaryButton.instantiate()\n\t\tgrid.add_child(join_btn)\n\t\tjoin_btn.text = \"JOIN\"\n\t\tjoin_btn.pressed.connect(_on_lobby_join_pressed.bind(lobby))\n\n\nfunc _on_lobby_join_pressed(p_lobby: HLobby):\n\tvar lobbies_view: LobbiesView = Store.get_view(\"Lobbies\")\n\tvar lobby = await HLobbies.join_async(p_lobby)\n\tif not lobby:\n\t\tprint(\"Failed to join lobby\")\n\t\treturn\n\t\n\tlobby.add_current_member_attribute(LobbiesView.SKIN_ATTRIBUTE_KEY, Store.get_new_random(LobbiesView.Skins.values()))\n\tlobby.add_current_member_attribute(LobbiesView.USERNAME_ATTRIBUTE_KEY, HAuth.display_name)\n\tlobbies_view.hide_search_results()\n\t\n\tawait lobby.update_async()\n\tlobbies_view.set_current_lobby(lobby)\n\t\n\n\tsearch_results = []\n\t_reset()\n\n\nfunc _reset():\n\tvar i = grid.get_child_count() - 1\n\twhile i >= GRID_CONTAINER_LABELS_COUNT:\n\t\tvar node = grid.get_child(i)\n\t\tnode.queue_free()\n\t\ti -= 1\n"
  },
  {
    "path": "sample/scenes/LobbiesView/SearchLobbyResults.gd.uid",
    "content": "uid://c42grjipjn5g0\n"
  },
  {
    "path": "sample/scenes/LoginView/EnterCredentials.gd",
    "content": "extends VBoxContainer\n\n\nsignal perform_login\n\n@onready var id_label = $IdLabel\n@onready var token_label = $TokenLabel\n\n@onready var id_lineedit = $IdLineEdit\n@onready var token_lineedit = $TokenLineEdit\n\n\nfunc _ready() -> void:\n\ttoken_lineedit.text_submitted.connect(func(_new_text): perform_login.emit())\n\n\nfunc set_helper_texts(id_help: String, token_help: String):\n\tif id_help != \"\":\n\t\tid_label.text = id_help\n\t\tid_label.visible = true\n\t\tid_lineedit.visible = true\n\telse:\n\t\tid_label.visible = false\n\t\tid_lineedit.visible = false\n\n\tif token_help != \"\":\n\t\ttoken_label.text = token_help\n\t\ttoken_label.visible = true\n\t\ttoken_lineedit.visible = true\n\telse:\n\t\ttoken_label.visible = false\n\t\ttoken_lineedit.visible = false\n\n\nfunc set_id_text(text: String):\n\tid_label.text = text\n\n\nfunc set_token_text(text: String):\n\ttoken_label.text = text\n\n\nfunc set_id_value(text: String):\n\tid_lineedit.text = text\n\n\nfunc get_id_value() -> String:\n\treturn id_lineedit.text\n\n\nfunc get_token_value() -> String:\n\treturn token_lineedit.text\n\n\nfunc reset_lineedits():\n\tid_lineedit.text = \"\"\n\ttoken_lineedit.text = \"\"\n\n\nfunc _notification(what: int) -> void:\n\tif what == NOTIFICATION_VISIBILITY_CHANGED:\n\t\tif visible:\n\t\t\treset_lineedits()\n"
  },
  {
    "path": "sample/scenes/LoginView/EnterCredentials.gd.uid",
    "content": "uid://bx0bhh73kw3q7\n"
  },
  {
    "path": "sample/scenes/LoginView/LoginView.gd",
    "content": "class_name LoginView\nextends CenterContainer\n\n#region Enums\n\nenum States {\n\tChooseMethod,\n\tEnterCredentials,\n\tPending,\n\tSuccess,\n\tError\n}\n\n#endregion\n\n\n#region Constants\n\nconst LOGIN_TYPES = {\n\tDEVELOPER = {\n\t\ttype = \"DEVELOPER\",\n\t\tname = \"Developer App\",\n\t\tid_help = \"Devtool Server URL\",\n\t\ttoken_help = \"Credential Name\"\n\t},\n\tDISCORD = {\n\t\ttype = \"DISCORD\",\n\t\tname = \"Discord\",\n\t\tid_help = \"\",\n\t\ttoken_help = \"Discord OAuth2 Token\"\n\t},\n\tDEVICE_ID = {\n\t\ttype = \"DEVICE_ID\",\n\t\tname = \"Device Id\",\n\t\tid_help = \"Display Name\",\n\t\ttoken_help = \"\"\n\t},\n\tACCOUNT_PORTAL = {\n\t\ttype = \"ACCOUNT_PORTAL\",\n\t\tname = \"Account Portal\",\n\t\tid_help = \"\",\n\t\ttoken_help = \"\"\n\t},\n\tPERSISTENT_AUTH = {\n\t\ttype = \"PERSISTENT_AUTH\",\n\t\tname = \"Persistent Auth\",\n\t\tid_help = \"\",\n\t\ttoken_help = \"\"\n\t}\n}\n\n#endregion\n\n\n#region Private vars\n\nvar _state = States.ChooseMethod\n\n#endregion\n\n\n#region Onready vars\n\n@onready var login_type_btn = $HB/Right/ChooseMethod/LoginTypeButton\n@onready var login_btn = $HB/Right/LoginButton\n@onready var back_btn = $HB/Right/BackButton\n@onready var retry_login_btn = $HB/Right/RetryLoginButton\n@onready var logout_btn = $HB/Right/LogoutButton\n\n# Sub Views\n@onready var choose_method = $HB/Right/ChooseMethod\n@onready var enter_credentials = $HB/Right/EnterCredentials\n@onready var login_status = $HB/Right/LoginStatus\n\n#endregion\n\n\n#region Built-in methods\n\nfunc _ready() -> void:\n\t_populate_login_type_dropdown()\n\t\n\tenter_credentials.perform_login.connect(_on_login_btn_pressed)\n\tlogin_btn.pressed.connect(_on_login_btn_pressed)\n\tback_btn.pressed.connect(_on_back_btn_pressed)\n\tretry_login_btn.pressed.connect(_on_retry_login_btn_pressed)\n\tlogout_btn.pressed.connect(_on_logout_btn_pressed)\n\n\tHAuth.logged_in.connect(_on_logged_in)\n\tHAuth.display_name_changed.connect(_on_display_name_changed)\n\tHAuth.login_error.connect(_on_login_error)\n\tHAuth.logged_out.connect(_on_logged_out)\n\n\tawait HPlatform.platform_created\n\t# TODO: Remove Autologin (PersistentAuth) for debug purpose\n\t# For developement\n\t# _set_login_status(\"Logging in...\")\n\t# _set_login_state(States.Pending)\n\t# HAuth.login_persistent_auth_async()\n\n#endregion\n\n\n#region Private methods\n\nfunc _on_logged_in():\n\t_set_login_state(States.Success)\n\n\nfunc _on_display_name_changed():\n\tprint(\"User display name: \", HAuth.display_name)\n\n\nfunc _on_logged_out():\n\t_set_login_status(\"Logout successful\")\n\t_set_login_state(States.ChooseMethod)\n\n\nfunc _on_login_error(result_code: EOS.Result):\n\t_set_login_state(States.Error)\n\t_set_login_status(\"Login Error: \" + EOS.result_str(result_code))\n\n\nfunc _on_retry_login_btn_pressed():\n\t_set_login_state(States.ChooseMethod)\n\n\nfunc _on_back_btn_pressed():\n\t_set_login_state(States.ChooseMethod)\n\n\nfunc _on_login_btn_pressed():\n\tvar login_type_data = login_type_btn.get_selected_metadata()\n\tvar login_type = login_type_data.type\n\tvar login_id = enter_credentials.get_id_value()\n\tvar login_token = enter_credentials.get_token_value()\n\n\tif _state == States.ChooseMethod:\n\t\t# In ChooseMethod state\n\t\tif login_type_data.id_help or login_type_data.token_help:\n\t\t\t# User needs to enter some data\n\t\t\tenter_credentials.set_helper_texts(login_type_data.id_help, login_type_data.token_help)\n\t\t\t_set_login_state(States.EnterCredentials)\n\n\t\t\tif login_type == \"DISCORD\":\n\t\t\t\tOS.shell_open(\"https://discord.com/api/oauth2/authorize?client_id=959047632091762719&redirect_uri=http%3A%2F%2Flocalhost%3A53134&response_type=token&scope=identify%20email\")\n\t\t\telif login_type == \"DEVELOPER\":\n\t\t\t\tenter_credentials.set_id_value(\"localhost:4545\")\n\t\telse:\n\t\t\t# No data entry is required\n\t\t\tlogin_status.text = \"Logging in...\"\n\t\t\t_set_login_state(States.Pending)\n\t\t\tmatch login_type:\n\t\t\t\t\"PERSISTENT_AUTH\":\n\t\t\t\t\tHAuth.login_persistent_auth_async()\n\t\t\t\t\"ACCOUNT_PORTAL\":\n\t\t\t\t\tHAuth.login_account_portal_async()\n\telse:\n\t\tlogin_status.text = \"Logging in...\"\n\t\t_set_login_state(States.Pending)\n\t\t# In EnterCredentials state\n\t\tmatch login_type:\n\t\t\t\"DEVICE_ID\":\n\t\t\t\tHAuth.login_anonymous_async(login_id)\n\t\t\t\"DISCORD\":\n\t\t\t\t_login_game_services(EOS.ExternalCredentialType.DiscordAccessToken, login_token)\n\t\t\t\"DEVELOPER\":\n\t\t\t\tHAuth.login_devtool_async(login_id, login_token)\n\n\nfunc _on_logout_btn_pressed():\n\tlogin_status.text = \"Logout pending...\"\n\t_set_login_state(States.Pending)\n\tHAuth.logout_async()\n\n\nfunc _set_login_state(new_state: States):\n\t_state = new_state\n\n\tfor child in $HB/Right.get_children():\n\t\tchild.visible = false\n\n\tif _state == States.ChooseMethod:\n\t\tchoose_method.visible = true\n\t\tlogin_btn.visible = true\n\n\tif _state == States.Error:\n\t\tlogin_status.visible = true\n\t\tretry_login_btn.visible = true\n\n\tif _state == States.EnterCredentials:\n\t\tenter_credentials.visible = true\n\t\tback_btn.visible = true\n\t\tlogin_btn.visible = true\n\n\tif _state == States.Pending:\n\n\t\tlogin_status.visible = true\n\n\tif _state == States.Success:\n\t\tlogin_status.text = \"Login success!\"\n\t\tlogin_status.visible = true\n\t\tlogout_btn.visible = true\n\n\nfunc _login_game_services(type: int, token = null, display_name = null):\n\t_set_login_status(\"Logging in to Epic Games Services...\")\n\n\tvar login_options = EOS.Connect.LoginOptions.new()\n\tlogin_options.credentials = EOS.Connect.Credentials.new()\n\tlogin_options.credentials.type = type\n\tlogin_options.credentials.token = token\n\tif display_name:\n\t\tlogin_options.user_login_info = EOS.Connect.UserLoginInfo.new()\n\t\tlogin_options.user_login_info.display_name = display_name\n\tHAuth.login_game_services_async(login_options)\n\n\nfunc _set_login_status(new_login_status: String):\n\tlogin_status.text = new_login_status\n\n\nfunc _populate_login_type_dropdown():\n\tvar idx = 0\n\tfor login_type in LOGIN_TYPES.keys():\n\t\tlogin_type_btn.add_item(LOGIN_TYPES[login_type].name)\n\t\tlogin_type_btn.set_item_metadata(idx, LOGIN_TYPES[login_type])\n\t\tidx += 1\n\n#endregion\n"
  },
  {
    "path": "sample/scenes/LoginView/LoginView.gd.uid",
    "content": "uid://dwpfnhluy8h4e\n"
  },
  {
    "path": "sample/scenes/LoginView/LoginView.tscn",
    "content": "[gd_scene load_steps=15 format=3 uid=\"uid://bht0ln2ftshrw\"]\n\n[ext_resource type=\"FontFile\" uid=\"uid://njn2rf7rj4ph\" path=\"res://fonts/roboto-32b.tres\" id=\"1\"]\n[ext_resource type=\"FontFile\" uid=\"uid://bxcl265jykrk0\" path=\"res://fonts/roboto-16r.tres\" id=\"2\"]\n[ext_resource type=\"Script\" uid=\"uid://dwpfnhluy8h4e\" path=\"res://scenes/LoginView/LoginView.gd\" id=\"3\"]\n[ext_resource type=\"FontFile\" uid=\"uid://bghbav6kh0lsl\" path=\"res://fonts/roboto-16b.tres\" id=\"4\"]\n[ext_resource type=\"Script\" uid=\"uid://bx0bhh73kw3q7\" path=\"res://scenes/LoginView/EnterCredentials.gd\" id=\"5\"]\n[ext_resource type=\"Texture2D\" uid=\"uid://e0l4pytsqbp1\" path=\"res://logo.png\" id=\"6\"]\n\n[sub_resource type=\"StyleBoxFlat\" id=\"1\"]\ncontent_margin_top = 3.0\ncontent_margin_bottom = 3.0\nbg_color = Color(0.164706, 0.505882, 0.188235, 1)\ncorner_radius_top_left = 3\ncorner_radius_top_right = 3\ncorner_radius_bottom_right = 3\ncorner_radius_bottom_left = 3\n\n[sub_resource type=\"StyleBoxFlat\" id=\"2\"]\ncontent_margin_top = 3.0\ncontent_margin_bottom = 3.0\nbg_color = Color(0.203922, 0.623529, 0.235294, 1)\ncorner_radius_top_left = 3\ncorner_radius_top_right = 3\ncorner_radius_bottom_right = 3\ncorner_radius_bottom_left = 3\n\n[sub_resource type=\"StyleBoxFlat\" id=\"3\"]\ncontent_margin_top = 3.0\ncontent_margin_bottom = 3.0\nbg_color = Color(0.145098, 0.454902, 0.164706, 1)\ncorner_radius_top_left = 3\ncorner_radius_top_right = 3\ncorner_radius_bottom_right = 3\ncorner_radius_bottom_left = 3\n\n[sub_resource type=\"StyleBoxFlat\" id=\"7\"]\ncontent_margin_top = 3.0\ncontent_margin_bottom = 3.0\nbg_color = Color(0.529412, 0.529412, 0.219608, 1)\ncorner_radius_top_left = 3\ncorner_radius_top_right = 3\ncorner_radius_bottom_right = 3\ncorner_radius_bottom_left = 3\n\n[sub_resource type=\"StyleBoxFlat\" id=\"8\"]\ncontent_margin_top = 3.0\ncontent_margin_bottom = 3.0\nbg_color = Color(0.631373, 0.631373, 0.258824, 1)\ncorner_radius_top_left = 3\ncorner_radius_top_right = 3\ncorner_radius_bottom_right = 3\ncorner_radius_bottom_left = 3\n\n[sub_resource type=\"StyleBoxFlat\" id=\"9\"]\ncontent_margin_top = 3.0\ncontent_margin_bottom = 3.0\nbg_color = Color(0.47, 0.47, 0.1927, 1)\ncorner_radius_top_left = 3\ncorner_radius_top_right = 3\ncorner_radius_bottom_right = 3\ncorner_radius_bottom_left = 3\n\n[sub_resource type=\"StyleBoxFlat\" id=\"11\"]\ncontent_margin_top = 3.0\ncontent_margin_bottom = 3.0\nbg_color = Color(0.529412, 0.258824, 0.215686, 1)\ncorner_radius_top_left = 3\ncorner_radius_top_right = 3\ncorner_radius_bottom_right = 3\ncorner_radius_bottom_left = 3\n\n[sub_resource type=\"StyleBoxFlat\" id=\"10\"]\ncontent_margin_top = 3.0\ncontent_margin_bottom = 3.0\nbg_color = Color(0.6, 0.294118, 0.247059, 1)\ncorner_radius_top_left = 3\ncorner_radius_top_right = 3\ncorner_radius_bottom_right = 3\ncorner_radius_bottom_left = 3\n\n[node name=\"LoginView\" type=\"CenterContainer\"]\nanchors_preset = 15\nanchor_right = 1.0\nanchor_bottom = 1.0\nsize_flags_vertical = 3\nscript = ExtResource(\"3\")\n\n[node name=\"HB\" type=\"HBoxContainer\" parent=\".\"]\nlayout_mode = 2\ntheme_override_constants/separation = 8\n\n[node name=\"Left\" type=\"VBoxContainer\" parent=\"HB\"]\ncustom_minimum_size = Vector2(400, 0)\nlayout_mode = 2\ntheme_override_constants/separation = 8\n\n[node name=\"TextureRect\" type=\"TextureRect\" parent=\"HB/Left\"]\ncustom_minimum_size = Vector2(128, 128)\nlayout_mode = 2\nsize_flags_horizontal = 0\ntexture = ExtResource(\"6\")\nexpand_mode = 1\nstretch_mode = 5\n\n[node name=\"Title\" type=\"Label\" parent=\"HB/Left\"]\nlayout_mode = 2\ntheme_override_fonts/font = ExtResource(\"1\")\ntext = \"EOS Godot Sample\"\n\n[node name=\"Desc\" type=\"RichTextLabel\" parent=\"HB/Left\"]\nlayout_mode = 2\ntheme_override_fonts/bold_font = ExtResource(\"4\")\nbbcode_enabled = true\ntext = \"This sample project demonstrates how to use Epic Online Services SDK in Godot using a SDK wrapper.\n\nThis project is not affiliated with Epic Games Inc nor does it endorse Epic Online Services.\nUse at your own risk.\"\n\n[node name=\"Right\" type=\"VBoxContainer\" parent=\"HB\"]\ncustom_minimum_size = Vector2(300, 0)\nlayout_mode = 2\nsize_flags_vertical = 4\ntheme_override_constants/separation = 8\n\n[node name=\"ChooseMethod\" type=\"VBoxContainer\" parent=\"HB/Right\"]\nlayout_mode = 2\n\n[node name=\"LoginTypeLabel\" type=\"Label\" parent=\"HB/Right/ChooseMethod\"]\nlayout_mode = 2\ntext = \"Login Type\"\n\n[node name=\"LoginTypeButton\" type=\"OptionButton\" parent=\"HB/Right/ChooseMethod\"]\nlayout_mode = 2\n\n[node name=\"EnterCredentials\" type=\"VBoxContainer\" parent=\"HB/Right\"]\nvisible = false\nlayout_mode = 2\nscript = ExtResource(\"5\")\n\n[node name=\"IdLabel\" type=\"Label\" parent=\"HB/Right/EnterCredentials\"]\nlayout_mode = 2\ntext = \"Devtool Server URL\"\n\n[node name=\"IdLineEdit\" type=\"LineEdit\" parent=\"HB/Right/EnterCredentials\"]\nlayout_mode = 2\ntext = \"localhost:8000\"\n\n[node name=\"TokenLabel\" type=\"Label\" parent=\"HB/Right/EnterCredentials\"]\nlayout_mode = 2\ntext = \"Credential Name\"\n\n[node name=\"TokenLineEdit\" type=\"LineEdit\" parent=\"HB/Right/EnterCredentials\"]\nlayout_mode = 2\nsecret = true\n\n[node name=\"LoginButton\" type=\"Button\" parent=\"HB/Right\"]\nlayout_mode = 2\nmouse_default_cursor_shape = 2\ntheme_override_fonts/font = ExtResource(\"2\")\ntheme_override_styles/focus = SubResource(\"1\")\ntheme_override_styles/hover = SubResource(\"2\")\ntheme_override_styles/pressed = SubResource(\"3\")\ntheme_override_styles/normal = SubResource(\"1\")\ntext = \"Log in\"\n\n[node name=\"BackButton\" type=\"Button\" parent=\"HB/Right\"]\nvisible = false\nlayout_mode = 2\nmouse_default_cursor_shape = 2\ntheme_override_fonts/font = ExtResource(\"2\")\ntheme_override_styles/focus = SubResource(\"7\")\ntheme_override_styles/hover = SubResource(\"8\")\ntheme_override_styles/pressed = SubResource(\"9\")\ntheme_override_styles/normal = SubResource(\"7\")\ntext = \"Back\"\n\n[node name=\"LoginStatus\" type=\"Label\" parent=\"HB/Right\"]\nvisible = false\nlayout_mode = 2\ntext = \"Logging in...\"\n\n[node name=\"RetryLoginButton\" type=\"Button\" parent=\"HB/Right\"]\nvisible = false\nlayout_mode = 2\nmouse_default_cursor_shape = 2\ntheme_override_fonts/font = ExtResource(\"2\")\ntheme_override_styles/focus = SubResource(\"7\")\ntheme_override_styles/hover = SubResource(\"8\")\ntheme_override_styles/pressed = SubResource(\"9\")\ntheme_override_styles/normal = SubResource(\"7\")\ntext = \"Retry\"\n\n[node name=\"LogoutButton\" type=\"Button\" parent=\"HB/Right\"]\nvisible = false\nlayout_mode = 2\nmouse_default_cursor_shape = 2\ntheme_override_fonts/font = ExtResource(\"2\")\ntheme_override_styles/focus = SubResource(\"11\")\ntheme_override_styles/hover = SubResource(\"10\")\ntheme_override_styles/pressed = SubResource(\"10\")\ntheme_override_styles/normal = SubResource(\"11\")\ntext = \"Logout\"\n"
  },
  {
    "path": "sample/scenes/LogsView/LogsView.gd",
    "content": "class_name LogsView\nextends VBoxContainer\n\n@onready var logs_label = %LogsLabel\n\nfunc _ready() -> void:\n\tHPlatform.log_msg.connect(func(msg: EOS.Logging.LogMessage):\n\t\tlog_msg(msg.level, msg.message, msg.category)\n\t)\n\tHPlatform.platform_initialized.connect(_on_platform_initialized)\n\n\nfunc _on_platform_initialized() -> void:\n\t# Set logging categories and level\n\tHPlatform.set_eos_log_level(EOS.Logging.LogCategory.AllCategories, EOS.Logging.LogLevel.Info)\n\n\nfunc log_msg(level: int, msg: String, category := \"\"):\n\tvar color = \"#ffffff\"\n\tvar level_str = \"Info\"\n\tmatch level:\n\t\tEOS.Logging.LogLevel.VeryVerbose:\n\t\t\tcolor = \"#555555\"\n\t\t\tlevel_str = \"VeryVerbose\"\n\t\tEOS.Logging.LogLevel.Verbose:\n\t\t\tcolor = \"#aaaaaa\"\n\t\t\tlevel_str = \"Verbose\"\n\t\tEOS.Logging.LogLevel.Warning:\n\t\t\tcolor = \"#ffff00\"\n\t\t\tlevel_str = \"Warning\"\n\t\tEOS.Logging.LogLevel.Error:\n\t\t\tcolor = \"#bb0000\"\n\t\t\tlevel_str = \"Error\"\n\t\tEOS.Logging.LogLevel.Fatal:\n\t\t\tcolor = \"#ff0000\"\n\t\t\tlevel_str = \"Fatal\"\n\n\tvar _category = \"LOG\"\n\tif category != \"\":\n\t\t_category = category\n\n\tvar darkened_color = Color(color).darkened(0.2).to_html(true)\n\tvar to_print = \"[color=#%s]%s\\t%s\\t[/color][color=%s]%s[/color]\" % [darkened_color, _category, level_str, color, msg]\n\tlogs_label.text += to_print + \"\\n\"\n\t# Uncomment the below line if you want to see EOS logs in terminal too\n\t# print_rich(to_print)\n"
  },
  {
    "path": "sample/scenes/LogsView/LogsView.gd.uid",
    "content": "uid://b54ebdyvahtmv\n"
  },
  {
    "path": "sample/scenes/LogsView/LogsView.tscn",
    "content": "[gd_scene load_steps=6 format=3 uid=\"uid://cl2qvlvdhn2iw\"]\n\n[ext_resource type=\"FontFile\" uid=\"uid://da6bpapjl4a5k\" path=\"res://fonts/roboto-13r.tres\" id=\"1\"]\n[ext_resource type=\"Script\" uid=\"uid://b54ebdyvahtmv\" path=\"res://scenes/LogsView/LogsView.gd\" id=\"2\"]\n[ext_resource type=\"FontFile\" uid=\"uid://djdr1hyqtgka6\" path=\"res://fonts/Roboto-Bold.ttf\" id=\"3_xmddo\"]\n\n[sub_resource type=\"StyleBoxFlat\" id=\"5\"]\nbg_color = Color(0.0627451, 0.0627451, 0.0627451, 1)\nborder_width_left = 1\nborder_width_top = 1\nborder_width_right = 1\nborder_width_bottom = 1\nborder_color = Color(0.427451, 0.427451, 0.427451, 1)\n\n[sub_resource type=\"StyleBoxEmpty\" id=\"StyleBoxEmpty_p3j38\"]\n\n[node name=\"LogsView\" type=\"VBoxContainer\"]\ncustom_minimum_size = Vector2(0, 100)\nanchors_preset = 15\nanchor_right = 1.0\nanchor_bottom = 1.0\nsize_flags_vertical = 3\nscript = ExtResource(\"2\")\n\n[node name=\"PC\" type=\"PanelContainer\" parent=\".\"]\nlayout_mode = 2\nsize_flags_horizontal = 3\nsize_flags_vertical = 3\ntheme_override_styles/panel = SubResource(\"5\")\n\n[node name=\"SC\" type=\"ScrollContainer\" parent=\"PC\"]\nlayout_mode = 2\nsize_flags_horizontal = 3\nsize_flags_vertical = 3\n\n[node name=\"LogsLabel\" type=\"RichTextLabel\" parent=\"PC/SC\"]\nunique_name_in_owner = true\nlayout_mode = 2\nsize_flags_horizontal = 3\nsize_flags_vertical = 3\nfocus_mode = 2\ntheme_override_fonts/normal_font = ExtResource(\"1\")\ntheme_override_fonts/bold_font = ExtResource(\"3_xmddo\")\ntheme_override_styles/focus = SubResource(\"StyleBoxEmpty_p3j38\")\nbbcode_enabled = true\ntext = \"[b]EOS Logs[/b]\nLogs from EOS are shown here. The game's logs are shown in Godot's Output panel.\n\"\nfit_content = true\nscroll_following = true\ncontext_menu_enabled = true\nselection_enabled = true\n"
  },
  {
    "path": "sample/scenes/MetricsView/MetricsView.gd",
    "content": "class_name MetricView\nextends VBoxContainer\n\n@onready var begin_player_session_btn = %BeginPlayerSessionBtn\n@onready var end_player_session_btn = %EndPlayerSessionBtn\n\n\nfunc _ready() -> void:\n\tbegin_player_session_btn.pressed.connect(_on_begin_player_session_btn_pressed)\n\tend_player_session_btn.pressed.connect(_on_end_player_session_btn_pressed)\n\n\nfunc _on_begin_player_session_btn_pressed():\n\tvar begin_sess_opts = EOS.Metrics.BeginPlayerSessionOptions.new()\n\tbegin_sess_opts.controller_type = EOS.Metrics.UserControllerType.MouseKeyboard\n\n\tif HAuth.epic_account_id:\n\t\tbegin_sess_opts.account_id_type = EOS.Metrics.MetricsAccountIdType.Epic\n\t\tbegin_sess_opts.account_id = HAuth.epic_account_id\n\telse:\n\t\tbegin_sess_opts.account_id_type = EOS.Metrics.MetricsAccountIdType.External\n\t\tbegin_sess_opts.account_id = HAuth.product_user_id\n\n\tif HAuth.display_name:\n\t\tbegin_sess_opts.display_name = HAuth.display_name\n\telse:\n\t\tbegin_sess_opts.display_name = \"Unnamed user\"\n\n\tvar begin_sess_ret = EOS.Metrics.MetricsInterface.begin_player_session(begin_sess_opts)\n\tprint(\"--- Metrics: begin_player_session: \",EOS.result_str(begin_sess_ret))\n\n\nfunc _on_end_player_session_btn_pressed():\n\tvar end_sess_opts = EOS.Metrics.EndPlayerSessionOptions.new()\n\n\tif HAuth.epic_account_id != \"\":\n\t\tend_sess_opts.account_id_type = EOS.Metrics.MetricsAccountIdType.Epic\n\t\tend_sess_opts.account_id = HAuth.epic_account_id\n\telse:\n\t\tend_sess_opts.account_id_type = EOS.Metrics.MetricsAccountIdType.External\n\t\tend_sess_opts.account_id = HAuth.product_user_id\n\n\tvar end_sess_ret = EOS.Metrics.MetricsInterface.end_player_session(end_sess_opts)\n\tprint(\"--- Metrics: end_player_session: \", EOS.result_str(end_sess_ret))\n\n"
  },
  {
    "path": "sample/scenes/MetricsView/MetricsView.gd.uid",
    "content": "uid://b081ugrjtk51r\n"
  },
  {
    "path": "sample/scenes/MetricsView/MetricsView.tscn",
    "content": "[gd_scene load_steps=4 format=3 uid=\"uid://bd06h3ufkhfd7\"]\n\n[ext_resource type=\"Script\" uid=\"uid://b081ugrjtk51r\" path=\"res://scenes/MetricsView/MetricsView.gd\" id=\"1\"]\n[ext_resource type=\"LabelSettings\" uid=\"uid://dcb771ib3tfno\" path=\"res://styles/ViewTitleLabelSettings.tres\" id=\"2_ftyuk\"]\n[ext_resource type=\"PackedScene\" uid=\"uid://t8s6xh1ax7uy\" path=\"res://scenes/UI/PrimaryButton.tscn\" id=\"5\"]\n\n[node name=\"MetricsView\" type=\"VBoxContainer\"]\nanchors_preset = 15\nanchor_right = 1.0\nanchor_bottom = 1.0\nsize_flags_horizontal = 3\nsize_flags_vertical = 3\nscript = ExtResource(\"1\")\n\n[node name=\"Title\" type=\"Label\" parent=\".\"]\nlayout_mode = 2\nsize_flags_vertical = 1\ntext = \"Metrics\"\nlabel_settings = ExtResource(\"2_ftyuk\")\n\n[node name=\"HB\" type=\"HBoxContainer\" parent=\".\"]\nlayout_mode = 2\ntheme_override_constants/separation = 16\n\n[node name=\"BeginPlayerSessionBtn\" parent=\"HB\" instance=ExtResource(\"5\")]\nunique_name_in_owner = true\nlayout_mode = 2\nsize_flags_horizontal = 0\ntext = \"Begin Player Sesssion\"\n\n[node name=\"EndPlayerSessionBtn\" parent=\"HB\" instance=ExtResource(\"5\")]\nunique_name_in_owner = true\nlayout_mode = 2\nsize_flags_horizontal = 0\ntext = \"End Player Session\"\n"
  },
  {
    "path": "sample/scenes/NotificationsView/NotificationsView.gd",
    "content": "class_name NotificationsView\nextends MarginContainer\n\n@onready var vb = $SC/PC/MC/VB\n\nfunc add_notification(node: Node):\n\tvb.add_child(node)\n\tnode.fade_in()\n"
  },
  {
    "path": "sample/scenes/NotificationsView/NotificationsView.gd.uid",
    "content": "uid://6tlvlmuarqub\n"
  },
  {
    "path": "sample/scenes/StatsView/StatsView.gd",
    "content": "class_name StatsView\nextends VBoxContainer\n\n# Local cache of stats\nvar stats = []\n\n@onready var stat_name = %StatNameLineEdit\n@onready var ingest_amount = %IngestAmount\n@onready var ingest_btn = %IngestBtn\n@onready var refresh_my_stats_btn = %RefreshMyStatsBtn\n@onready var my_stats = %MyStatsRichTextLabel\n@onready var status_label = %StatusLabel\n\nfunc _ready() -> void:\n\tvisibility_changed.connect(_on_query_stats)\n\tHAuth.logged_out.connect(_on_logged_out)\n\n\tstat_name.text_changed.connect(_on_stat_name_text_changed)\n\tingest_btn.pressed.connect(_on_ingest_btn_pressed)\n\trefresh_my_stats_btn.pressed.connect(_on_query_stats)\n\n\nfunc _on_query_stats():\n\tif not visible: return\n\tstats = await HStats.get_stats_async()\n\t_rebuild_ui()\n\n\nfunc _on_logged_out():\n\tstats = []\n\t_rebuild_ui()\n\nfunc _on_stat_name_text_changed(new_text: String):\n\tif new_text.strip_edges() == \"\":\n\t\tingest_btn.disabled = true\n\telse:\n\t\tingest_btn.disabled = false\n\nfunc _on_ingest_btn_pressed():\n\tingest_stat(stat_name.text, ingest_amount.value)\n\n\nfunc ingest_stat(_stat_name: String, _ingest_amount: int):\n\tstatus_label.text = \"Ingesting stat...\"\n\tvar ret := await HStats.ingest_stat_async(_stat_name, _ingest_amount)\n\tif not EOS.is_success(ret):\n\t\tstatus_label.text = \"Ingesting Failed: \" + EOS.result_str(ret)\n\t\treturn\n\t\n\tstatus_label.text = \"Ingesting Success\"\n\t_on_query_stats()\n\t\n\nfunc _rebuild_ui():\n\tvar base_bbcode = \"\"\"[table=4]\n[cell][b]Name[/b][/cell]\n[cell][b]Value[/b][/cell]\n[cell][b]Start Time[/b][/cell]\n[cell][b]End Time[/b][/cell]\n%s\n[/table]\"\"\"\n\n\tvar rows_bbcode = \"\"\n\tfor stat in stats:\n\t\trows_bbcode += \"[cell]%s[/cell]\" % stat.name\n\t\trows_bbcode += \"[cell]%s[/cell]\" % stat.value\n\t\tif stat.start_time != EOS.Stats.STATS_TIME_UNDEFINED:\n\t\t\tvar time_str = Time.get_datetime_string_from_unix_time(stat.start_time)\n\t\t\trows_bbcode += \"[cell]%s[/cell]\" % time_str\n\t\telse:\n\t\t\trows_bbcode += \"[cell]Undefined[/cell]\"\n\n\t\tif stat.end_time != EOS.Stats.STATS_TIME_UNDEFINED:\n\t\t\tvar time_str = Time.get_datetime_string_from_unix_time(stat.end_time)\n\t\t\trows_bbcode += \"[cell]%s[/cell]\" % time_str\n\t\telse:\n\t\t\trows_bbcode += \"[cell]Undefined[/cell]\"\n\n\tmy_stats.text = base_bbcode % rows_bbcode\n"
  },
  {
    "path": "sample/scenes/StatsView/StatsView.gd.uid",
    "content": "uid://svry6i6h3yam\n"
  },
  {
    "path": "sample/scenes/StatsView/StatsView.tscn",
    "content": "[gd_scene load_steps=6 format=3 uid=\"uid://dgi7j5qx3xt84\"]\n\n[ext_resource type=\"Script\" uid=\"uid://svry6i6h3yam\" path=\"res://scenes/StatsView/StatsView.gd\" id=\"1\"]\n[ext_resource type=\"LabelSettings\" uid=\"uid://dcb771ib3tfno\" path=\"res://styles/ViewTitleLabelSettings.tres\" id=\"2_8cl02\"]\n[ext_resource type=\"FontFile\" uid=\"uid://bghbav6kh0lsl\" path=\"res://fonts/roboto-16b.tres\" id=\"3\"]\n[ext_resource type=\"PackedScene\" uid=\"uid://t8s6xh1ax7uy\" path=\"res://scenes/UI/PrimaryButton.tscn\" id=\"5\"]\n\n[sub_resource type=\"StyleBoxEmpty\" id=\"StyleBoxEmpty_m0bq4\"]\n\n[node name=\"StatsView\" type=\"VBoxContainer\"]\nanchors_preset = 15\nanchor_right = 1.0\nanchor_bottom = 1.0\nsize_flags_horizontal = 3\nsize_flags_vertical = 3\nscript = ExtResource(\"1\")\n\n[node name=\"Title\" type=\"Label\" parent=\".\"]\nlayout_mode = 2\nsize_flags_vertical = 1\ntext = \"Stats\"\nlabel_settings = ExtResource(\"2_8cl02\")\n\n[node name=\"VB\" type=\"VBoxContainer\" parent=\".\"]\nlayout_mode = 2\ntheme_override_constants/separation = 8\n\n[node name=\"StatNameLineEdit\" type=\"LineEdit\" parent=\"VB\"]\nunique_name_in_owner = true\ncustom_minimum_size = Vector2(250, 0)\nlayout_mode = 2\nsize_flags_horizontal = 0\nplaceholder_text = \"Enter stat name\"\n\n[node name=\"HBoxContainer\" type=\"HBoxContainer\" parent=\"VB\"]\nlayout_mode = 2\ntheme_override_constants/separation = 8\n\n[node name=\"AmountLabel\" type=\"Label\" parent=\"VB/HBoxContainer\"]\nlayout_mode = 2\ntext = \"Amount\"\nvertical_alignment = 1\n\n[node name=\"IngestAmount\" type=\"SpinBox\" parent=\"VB/HBoxContainer\"]\nunique_name_in_owner = true\nlayout_mode = 2\nsize_flags_horizontal = 0\nmax_value = 900000.0\nrounded = true\n\n[node name=\"HB\" type=\"HBoxContainer\" parent=\"VB\"]\nlayout_mode = 2\ntheme_override_constants/separation = 16\n\n[node name=\"IngestBtn\" parent=\"VB/HB\" instance=ExtResource(\"5\")]\nunique_name_in_owner = true\nlayout_mode = 2\nsize_flags_horizontal = 0\ndisabled = true\ntext = \"Ingest Stat\"\n\n[node name=\"StatusLabel\" type=\"Label\" parent=\"VB/HB\"]\nunique_name_in_owner = true\nlayout_mode = 2\n\n[node name=\"RefreshMyStatsBtn\" parent=\"VB\" instance=ExtResource(\"5\")]\nunique_name_in_owner = true\nlayout_mode = 2\nsize_flags_horizontal = 0\ntext = \"Refresh my stats\"\n\n[node name=\"HSeparator\" type=\"HSeparator\" parent=\"VB\"]\nlayout_mode = 2\ntheme_override_constants/separation = 16\n\n[node name=\"MyStatsLabel\" type=\"Label\" parent=\"VB\"]\nlayout_mode = 2\ntheme_override_fonts/font = ExtResource(\"3\")\ntext = \"My Stats\"\n\n[node name=\"VB\" type=\"VBoxContainer\" parent=\"VB\"]\nlayout_mode = 2\n\n[node name=\"MyStatsRichTextLabel\" type=\"RichTextLabel\" parent=\"VB/VB\"]\nunique_name_in_owner = true\nlayout_mode = 2\nfocus_mode = 2\ntheme_override_constants/table_h_separation = 16\ntheme_override_constants/table_v_separation = 4\ntheme_override_fonts/bold_font = ExtResource(\"3\")\ntheme_override_styles/focus = SubResource(\"StyleBoxEmpty_m0bq4\")\nbbcode_enabled = true\nfit_content = true\ncontext_menu_enabled = true\nselection_enabled = true\n"
  },
  {
    "path": "sample/scenes/UI/NetworkImage.gd",
    "content": "class_name NetworkImage\nextends MarginContainer\n\nvar LOADING_TEXTURE = preload(\"res://scenes/UI/loading-icon.png\")\n\n@onready var texture_rect = $TR\n@onready var anim_player = $Anim\n\nenum States {\n\tLoading,\n\tLoaded\n}\n\nvar _state = States.Loading\nvar _url: String\n\n\nfunc _ready() -> void:\n\tset_state(States.Loading)\n\n\nfunc set_state(new_state: States):\n\t_state = new_state\n\n\tif _state == States.Loading:\n\t\ttexture_rect.texture = LOADING_TEXTURE\n\t\tanim_player.play(\"rotate\")\n\telif _state == States.Loaded:\n\t\t$TR.set_rotation(0)\n\t\tanim_player.stop(true)\n\n\nfunc fetch_image(url: String):\n\t_url = url\n\tif Store.network_image_cache.has(url):\n\t\t# Directly set the image\n\t\ttexture_rect.texture = Store.network_image_cache[url]\n\t\tset_state(States.Loaded)\n\t\treturn\n\n\tset_state(States.Loading)\n\tvar http_request = HTTPRequest.new()\n\tadd_child(http_request)\n\thttp_request.request_completed.connect(_on_request_completed)\n\thttp_request.request(url)\n\n\nfunc _on_request_completed(result, response_code, _headers, body):\n\tif result != OK or response_code != 200:\n\t\tprint(\"Network Image Error: result=%s, response_code=%s\" % [result, response_code])\n\n\tvar image = Image.new()\n\tvar image_error = image.load_png_from_buffer(body)\n\tif image_error != OK:\n\t\tprint(\"Network Image Error: image_error=%s: An error occurred while trying to display the image.\" % image_error)\n\t\treturn\n\n\tvar image_texture = ImageTexture.create_from_image(image)\n\tStore.network_image_cache[_url] = image_texture\n\n\ttexture_rect.texture = image_texture\n\tset_state(States.Loaded)\n"
  },
  {
    "path": "sample/scenes/UI/NetworkImage.gd.uid",
    "content": "uid://bxtewm8nybcvn\n"
  },
  {
    "path": "sample/scenes/UI/NetworkImage.tscn",
    "content": "[gd_scene load_steps=6 format=3 uid=\"uid://djhhnis3ksdjk\"]\n\n[ext_resource type=\"Script\" uid=\"uid://bxtewm8nybcvn\" path=\"res://scenes/UI/NetworkImage.gd\" id=\"1\"]\n[ext_resource type=\"Texture2D\" uid=\"uid://dluvbejagvvak\" path=\"res://scenes/UI/loading-icon.png\" id=\"2\"]\n\n[sub_resource type=\"Animation\" id=\"1\"]\nlength = 0.001\ntracks/0/type = \"value\"\ntracks/0/imported = false\ntracks/0/enabled = true\ntracks/0/path = NodePath(\".:rotation\")\ntracks/0/interp = 1\ntracks/0/loop_wrap = true\ntracks/0/keys = {\n\"times\": PackedFloat32Array(0),\n\"transitions\": PackedFloat32Array(1),\n\"update\": 0,\n\"values\": [360.0]\n}\ntracks/1/type = \"value\"\ntracks/1/imported = false\ntracks/1/enabled = true\ntracks/1/path = NodePath(\"TR:rotation\")\ntracks/1/interp = 1\ntracks/1/loop_wrap = true\ntracks/1/keys = {\n\"times\": PackedFloat32Array(0),\n\"transitions\": PackedFloat32Array(1),\n\"update\": 0,\n\"values\": [360.0]\n}\n\n[sub_resource type=\"Animation\" id=\"2\"]\nresource_name = \"rotate\"\nloop_mode = 1\ntracks/0/type = \"value\"\ntracks/0/imported = false\ntracks/0/enabled = true\ntracks/0/path = NodePath(\"TR:rotation\")\ntracks/0/interp = 1\ntracks/0/loop_wrap = true\ntracks/0/keys = {\n\"times\": PackedFloat32Array(0, 1),\n\"transitions\": PackedFloat32Array(1, 1),\n\"update\": 0,\n\"values\": [0.0, 360.0]\n}\n\n[sub_resource type=\"AnimationLibrary\" id=\"AnimationLibrary_2aol3\"]\n_data = {\n&\"RESET\": SubResource(\"1\"),\n&\"rotate\": SubResource(\"2\")\n}\n\n[node name=\"NetworkImage\" type=\"MarginContainer\"]\noffset_right = 64.0\noffset_bottom = 64.0\nrotation = 360.0\nsize_flags_horizontal = 4\nsize_flags_vertical = 4\nmouse_filter = 2\nscript = ExtResource(\"1\")\n\n[node name=\"TR\" type=\"TextureRect\" parent=\".\"]\ncustom_minimum_size = Vector2(64, 64)\nlayout_mode = 2\ntexture = ExtResource(\"2\")\nexpand_mode = 1\nstretch_mode = 6\n\n[node name=\"Anim\" type=\"AnimationPlayer\" parent=\".\"]\nlibraries = {\n\"\": SubResource(\"AnimationLibrary_2aol3\")\n}\n"
  },
  {
    "path": "sample/scenes/UI/PrimaryButton.tscn",
    "content": "[gd_scene load_steps=5 format=3 uid=\"uid://t8s6xh1ax7uy\"]\n\n[sub_resource type=\"StyleBoxFlat\" id=\"6\"]\ncontent_margin_left = 8.0\ncontent_margin_top = 2.0\ncontent_margin_right = 8.0\ncontent_margin_bottom = 2.0\nbg_color = Color(0.0156863, 0.423529, 0.831373, 1)\ncorner_radius_top_left = 3\ncorner_radius_top_right = 3\ncorner_radius_bottom_right = 3\ncorner_radius_bottom_left = 3\n\n[sub_resource type=\"StyleBoxFlat\" id=\"5\"]\ncontent_margin_left = 4.0\ncontent_margin_right = 4.0\nbg_color = Color(0.0196078, 0.478431, 0.941176, 1)\ncorner_radius_top_left = 3\ncorner_radius_top_right = 3\ncorner_radius_bottom_right = 3\ncorner_radius_bottom_left = 3\n\n[sub_resource type=\"StyleBoxFlat\" id=\"7\"]\ncontent_margin_left = 8.0\ncontent_margin_top = 2.0\ncontent_margin_right = 8.0\ncontent_margin_bottom = 2.0\nbg_color = Color(0.00784314, 0.239216, 0.470588, 1)\ncorner_radius_top_left = 3\ncorner_radius_top_right = 3\ncorner_radius_bottom_right = 3\ncorner_radius_bottom_left = 3\n\n[sub_resource type=\"StyleBoxEmpty\" id=\"StyleBoxEmpty_ruuxx\"]\n\n[node name=\"PrimaryButton\" type=\"Button\"]\noffset_right = 118.0\noffset_bottom = 23.0\nmouse_default_cursor_shape = 2\ntheme_override_colors/font_disabled_color = Color(0.0588235, 0.0588235, 0.0588235, 1)\ntheme_override_styles/normal = SubResource(\"6\")\ntheme_override_styles/hover = SubResource(\"5\")\ntheme_override_styles/pressed = SubResource(\"5\")\ntheme_override_styles/disabled = SubResource(\"7\")\ntheme_override_styles/focus = SubResource(\"StyleBoxEmpty_ruuxx\")\ntext = \"PrimaryButton\"\n"
  },
  {
    "path": "sample/scenes/UI/joysticks.gd",
    "content": "extends Control\n\n@onready var shoot_joystick: TouchScreenJoystick = $ShootJoystick\n\n\nfunc _ready() -> void:\n\thide()\n\t\n\tif Store.is_mobile:\n\t\tshow()\n\t\n\tStore.shoot_joystick = shoot_joystick\n"
  },
  {
    "path": "sample/scenes/UI/joysticks.gd.uid",
    "content": "uid://dygslh2f7uw40\n"
  },
  {
    "path": "sample/scenes/UI/nat_type.gd",
    "content": "extends RichTextLabel\n\n\n#region built-in methods\n\nfunc _ready() -> void:\n\tHAuth.logged_in.connect(_on_logged_in)\n\tHAuth.logged_out.connect(_on_logged_out)\n\n#endregion\n\n\n#region private methods\n\nfunc _on_logged_in():\n\tvar nat_type := await HP2P.get_nat_type_async()\n\t\n\tmatch nat_type:\n\t\tEOS.P2P.NATType.Open:\n\t\t\ttext = \"[right]NAT: [color=#00ff00]Open[/color][/right]\"\n\t\tEOS.P2P.NATType.Moderate:\n\t\t\ttext = \"[right]NAT: [color=#ffff00]Moderate[/color][/right]\"\n\t\tEOS.P2P.NATType.Strict:\n\t\t\ttext = \"[right]NAT: [color=#ff0000]Strict[/color][/right]\"\n\t\t_:\n\t\t\ttext = \"[right]NAT: [color=#515151]Unknown[/color][/right]\"\n\n\tshow()\n\n\nfunc _on_logged_out():\n\ttext = \"\"\n\thide()\n#endregion\n"
  },
  {
    "path": "sample/scenes/UI/nat_type.gd.uid",
    "content": "uid://ft2lvpnnwl8k\n"
  },
  {
    "path": "sample/scenes/UI/nat_type.tscn",
    "content": "[gd_scene load_steps=2 format=3 uid=\"uid://bdlcslag0jdj1\"]\n\n[ext_resource type=\"Script\" uid=\"uid://ft2lvpnnwl8k\" path=\"res://scenes/UI/nat_type.gd\" id=\"1_hma6v\"]\n\n[node name=\"NatType\" type=\"RichTextLabel\"]\nanchors_preset = 3\nanchor_left = 1.0\nanchor_top = 1.0\nanchor_right = 1.0\nanchor_bottom = 1.0\noffset_left = -195.0\noffset_top = -30.0\noffset_right = -8.0\noffset_bottom = -7.0\ngrow_horizontal = 0\ngrow_vertical = 0\nbbcode_enabled = true\nscroll_active = false\nscript = ExtResource(\"1_hma6v\")\n"
  },
  {
    "path": "sample/scenes/UI/ping.gd",
    "content": "extends Label\n\n\nconst COUNT = 5\n\n\nvar _pings = []\nvar _ping_in_progress = false\nvar _last_ping_time = 0\n\n\nfunc _ready() -> void:\n\thide()\n\n\nfunc _on_timer_timeout() -> void:\n\tif _ping_in_progress and Time.get_ticks_msec() - _last_ping_time > 2000:\n\t\t_ping_in_progress = false\n\n\tif not _ping_in_progress and multiplayer.multiplayer_peer and \\\n\tnot multiplayer.is_server() and \\\n\tmultiplayer.multiplayer_peer.get_connection_status() == MultiplayerPeer.ConnectionStatus.CONNECTION_CONNECTED:\n\t\t_ping_in_progress = true\n\t\t_last_ping_time = Time.get_ticks_msec()\n\t\tping.rpc_id(1)\n\n\n@rpc(\"any_peer\")\nfunc ping():\n\tpong.rpc_id(multiplayer.get_remote_sender_id())\n\n\n@rpc\nfunc pong():\n\tvar rtt = Time.get_ticks_msec() - _last_ping_time\n\t_pings.append(rtt)\n\tif _pings.size() > COUNT:\n\t\t_pings.pop_front()\n\t\n\t\n\tvar avg = _pings.reduce(func (acc, p): return acc + p, 0.0) / _pings.size()\n\t\n\t\n\ttext = \"Ping: %s ms\" % ceil(avg)\n\tshow()\n\t_ping_in_progress = false\n"
  },
  {
    "path": "sample/scenes/UI/ping.gd.uid",
    "content": "uid://diilhyvdor4ym\n"
  },
  {
    "path": "sample/scenes/UI/ping.tscn",
    "content": "[gd_scene load_steps=2 format=3 uid=\"uid://c37wtoikc8pgp\"]\n\n[ext_resource type=\"Script\" uid=\"uid://diilhyvdor4ym\" path=\"res://scenes/UI/ping.gd\" id=\"1_suu5i\"]\n\n[node name=\"Ping\" type=\"Label\"]\noffset_right = 104.0\noffset_bottom = 23.0\ntext = \"Ping:\"\nhorizontal_alignment = 2\nscript = ExtResource(\"1_suu5i\")\n\n[node name=\"Timer\" type=\"Timer\" parent=\".\"]\nwait_time = 0.2\nautostart = true\n\n[connection signal=\"timeout\" from=\"Timer\" to=\".\" method=\"_on_timer_timeout\"]\n"
  },
  {
    "path": "sample/scenes/UI/players_score.gd",
    "content": "extends Label\n\n\nfunc _ready() -> void:\n\tStore.player_score_changed.connect(_on_players_score_changed)\n\n\nfunc _on_players_score_changed():\n\ttext = \"\"\n\tif not Store.current_lobby:\n\t\treturn\n\t\n\tvar players = get_tree().get_nodes_in_group(Store.GROUP_PLAYER)\n\tfor player in players:\n\t\tvar mem = Store.current_lobby.get_member_by_product_user_id(player.puid)\n\t\tif not mem: continue\n\t\tvar display_name_attr = mem.get_attribute(LobbiesView.USERNAME_ATTRIBUTE_KEY)\n\t\tvar display_name = \"User\"\n\t\tif display_name_attr:\n\t\t\tdisplay_name = display_name_attr.value\n\t\t\n\t\ttext += \"%s: %s\\n\" % [display_name, player.score]\n\n#endregion\n"
  },
  {
    "path": "sample/scenes/UI/players_score.gd.uid",
    "content": "uid://co6ig2d1xliiu\n"
  },
  {
    "path": "sample/scenes/UI/players_score.tscn",
    "content": "[gd_scene load_steps=2 format=3 uid=\"uid://8kmyoi08gr22\"]\n\n[ext_resource type=\"Script\" uid=\"uid://co6ig2d1xliiu\" path=\"res://scenes/UI/players_score.gd\" id=\"1_k6ifu\"]\n\n[node name=\"PlayersScore\" type=\"Label\"]\nanchors_preset = 1\nanchor_left = 1.0\nanchor_right = 1.0\noffset_left = -203.0\noffset_bottom = 56.0\ngrow_horizontal = 0\nscript = ExtResource(\"1_k6ifu\")\n"
  },
  {
    "path": "sample/scenes/UI/touch_screen_joystick.gd",
    "content": "##  RESPONSIVE TOUCHSCREEN JOYSTICK 1.0.2 ##\n\n# From https://github.com/kntCyc1230/TouchScreenJoystick\n# MIT License\n# Copyright (c) Kent Aljo G. Coyoca\n\n@tool\nextends Control\nclass_name TouchScreenJoystick\n\n@export var use_textures: bool:\n\tset(new_bool):\n\t\tuse_textures = new_bool\n\t\tnotify_property_list_changed()\n@export var knob_color := Color.WHITE\n@export var base_color := Color.WHITE\n@export var background_color := Color(Color.BLACK, 0.25)\n\n@export_range(0, 100, 0.1, \"or_greater\") var base_radius := 130.0\n@export_range(0, 100, 0.1, \"or_greater\") var knob_radius := 65.0\n@export var base_thickness := 1.8\n@export var anti_aliased: bool\n\n@export_group(\"Textures\")\n@export var use_custom_max_length: bool:\n\tset(new_bool):\n\t\tuse_custom_max_length = new_bool\n\t\tnotify_property_list_changed()\n\n@export_range(0, 100, 0.1, \"or_greater\") var max_length := 120.0\n@export_subgroup(\"Base Texture Params\")\n@export var base_texture: Texture2D\n@export_range(-360, 360, 0.01, \"or_greater\", \"or_less\", \"suffix:°\") var base_rotation: float\n@export var base_scale := 1.0\n\n@export_subgroup(\"Knob Texture Params\")\n@export var knob_texture: Texture2D\n@export_range(-360, 360, 0.01, \"or_greater\", \"or_less\", \"suffix:°\") var knob_rotation: float\n@export var knob_scale := 1.0\n\n@export_subgroup(\"Background Texture Params\")\n@export var background_texture: Texture2D\n@export_range(-360, 360, 0.01, \"or_greater\", \"or_less\", \"suffix:°\") var backround_rotation: float\n@export var background_scale := 1.0\n\n@export_group(\"Joystick Params\")\n@export_enum(\"FIXED\", \"DYNAMIC\") var mode := 0\n@export var deadzone := 10.0:\n\tset(new_deadzone):\n\t\tdeadzone = clamp(new_deadzone, 10, get_current_max_length())\n\n@export var smooth_reset: bool:\n\tset(new_bool):\n\t\tsmooth_reset = new_bool\n\t\tnotify_property_list_changed()\n@export var smooth_speed := 5.0\n@export var change_opacity_when_touched: bool:\n\tset(new_bool):\n\t\tchange_opacity_when_touched = new_bool\n\t\tnotify_property_list_changed()\n\n@export_range(0, 100, 0.01, \"suffix:%\") var from_opacity := 50.0\n@export_range(0, 100, 0.01, \"suffix:%\") var to_opacity := 100.0\n@export var use_input_actions: bool:\n\tset(new_bool):\n\t\tuse_input_actions = new_bool\n\t\tnotify_property_list_changed()\n\n@export_subgroup(\"Input Actions\")\n@export var action_left := \"ui_left\"\n@export var action_right := \"ui_right\"\n@export var action_up := \"ui_up\"\n@export var action_down := \"ui_down\"\n\n@export_group(\"Debug\")\n@export var draw_debugs: bool:\n\tset(new_bool):\n\t\tdraw_debugs = new_bool\n\t\tnotify_property_list_changed()\n@export var deadzone_color := Color(Color.RED, 0.5)\n@export var current_max_length_color := Color(Color.BLUE, 0.5)\n\nvar is_pressing: bool\nvar knob_position: Vector2\nvar finger_index := -1\nvar default_pos: Vector2\nvar current_input_event: InputEvent\nvar global_touch: Vector2\n\n\nfunc _ready() -> void:\n\tdefault_pos = position\n\tchange_opacity()\n\n\nfunc _process(_delta: float) -> void:\n\t# checks if currently pressing\n\tif is_pressing:\n\t\tmove_knob_pos()\n\telse:\n\t\treset_knob_pos()\n\t\n\t# update necessities\n\tupdate_input_actions()\n\tpivot_offset = size / 2\n\tqueue_redraw()\n\t\n\n#moves the knob position when pressing\nfunc move_knob_pos() -> void:\n\tvar centered_touch := global_touch - size / 2\n\t\n\tif get_distance() <= get_current_max_length():\n\t\tknob_position = centered_touch\n\telse:\n\t\t# calculates the angle position of the knob if it's position --\n\t\t# -- exceeds from the current max length\n\t\tvar angle := Vector2.ZERO.angle_to_point(centered_touch)\n\t\tknob_position.x = cos(angle) * get_current_max_length()\n\t\tknob_position.y = sin(angle) * get_current_max_length()\n\n\n# resets knob position if not pressing\nfunc reset_knob_pos() -> void:\n\tif smooth_reset:\n\t\tknob_position = lerp(knob_position, Vector2.ZERO, smooth_speed * get_process_delta_time())\n\telse:\n\t\tknob_position = Vector2.ZERO\n\n\n# triggers a specific input action based on the --\n# -- current direction\nfunc trigger_input_actions() -> void:\n\tvar dir := get_deadzoned_vector()\n\t\n\tif dir.x > 0:\n\t\tInput.action_release(action_left)\n\t\tInput.action_press(action_right, dir.x)\n\telse:\n\t\tInput.action_release(action_right)\n\t\tInput.action_press(action_left, - dir.x)\n\t\n\tif dir.y < 0:\n\t\tInput.action_release(action_down)\n\t\tInput.action_press(action_up, - dir.y)\n\telse:\n\t\tInput.action_release(action_up)\n\t\tInput.action_press(action_down, dir.y)\n\n\n# releases all input actions\nfunc release_input_actions() -> void:\n\tInput.action_release(action_right)\n\tInput.action_release(action_left)\n\tInput.action_release(action_up)\n\tInput.action_release(action_down)\n\n\nfunc update_input_actions() -> void:\n\tif use_input_actions and is_pressing:\n\t\ttrigger_input_actions()\n\n\n# please ignore these validitate functions it has nothing --\n# -- to do with the joystick's functionality \nfunc _validate_property(property: Dictionary) -> void:\n\tdeadzone = clamp(deadzone, 10, get_current_max_length())\n\tvaliditate_default_drawing_properties(property)\n\tvaliditate_texture_drawing_properties(property)\n\tvaliditate_input_action_properties(property)\n\tif property.name == \"smooth_speed\" and not smooth_reset:\n\t\tproperty.usage = PROPERTY_USAGE_READ_ONLY\n\t\n\tif property.name == \"from_opacity\" and not change_opacity_when_touched:\n\t\tproperty.usage = PROPERTY_USAGE_READ_ONLY\n\t\n\tif property.name == \"to_opacity\" and not change_opacity_when_touched:\n\t\tproperty.usage = PROPERTY_USAGE_READ_ONLY\n\t\n\tif property.name == \"deadzone_color\" and not draw_debugs:\n\t\tproperty.usage = PROPERTY_USAGE_READ_ONLY\n\t\n\tif property.name == \"current_max_length_color\" and not draw_debugs:\n\t\tproperty.usage = PROPERTY_USAGE_READ_ONLY\n\n\nfunc validitate_input_action_properties(property: Dictionary) -> void:\n\tif property.name == \"action_left\" and not use_input_actions:\n\t\tproperty.usage = PROPERTY_USAGE_READ_ONLY\n\t\n\tif property.name == \"action_right\" and not use_input_actions:\n\t\tproperty.usage = PROPERTY_USAGE_READ_ONLY\n\t\n\tif property.name == \"action_up\" and not use_input_actions:\n\t\tproperty.usage = PROPERTY_USAGE_READ_ONLY\n\t\n\tif property.name == \"action_down\" and not use_input_actions:\n\t\tproperty.usage = PROPERTY_USAGE_READ_ONLY\n\n\nfunc validitate_default_drawing_properties(property: Dictionary) -> void:\n\tif property.name == \"base_color\" and use_textures:\n\t\tproperty.usage = PROPERTY_USAGE_READ_ONLY\n\t\n\tif property.name == \"knob_color\" and use_textures:\n\t\tproperty.usage = PROPERTY_USAGE_READ_ONLY\n\t\n\tif property.name == \"background_color\" and use_textures:\n\t\tproperty.usage = PROPERTY_USAGE_READ_ONLY\n\t\n\tif property.name == \"base_radius\" and use_textures:\n\t\tproperty.usage = PROPERTY_USAGE_READ_ONLY\n\t\n\t\n\tif property.name == \"knob_radius\" and use_textures:\n\t\tproperty.usage = PROPERTY_USAGE_READ_ONLY\n\t\n\tif property.name == \"base_thickness\" and use_textures:\n\t\tproperty.usage = PROPERTY_USAGE_READ_ONLY\n\t\n\tif property.name == \"anti_aliased\" and use_textures:\n\t\tproperty.usage = PROPERTY_USAGE_READ_ONLY\n\n\nfunc validitate_texture_drawing_properties(property: Dictionary) -> void:\n\tif property.name == \"background_texture\" and not use_textures:\n\t\tproperty.usage = PROPERTY_USAGE_READ_ONLY\n\t\n\tif property.name == \"use_custom_max_length\" and not use_textures:\n\t\tproperty.usage = PROPERTY_USAGE_READ_ONLY\n\t\n\tif property.name == \"max_length\" and not use_textures:\n\t\tproperty.usage = PROPERTY_USAGE_READ_ONLY\n\t\n\tif property.name == \"max_length\" and not use_custom_max_length:\n\t\tproperty.usage = PROPERTY_USAGE_READ_ONLY\n\t\n\tif property.name == \"base_texture\" and not use_textures:\n\t\tproperty.usage = PROPERTY_USAGE_READ_ONLY\n\t\n\tif property.name == \"knob_texture\" and not use_textures:\n\t\tproperty.usage = PROPERTY_USAGE_READ_ONLY\n\t\n\tif property.name == \"base_scale\" and not use_textures:\n\t\tproperty.usage = PROPERTY_USAGE_READ_ONLY\n\t\n\tif property.name == \"base_rotation\" and not use_textures:\n\t\tproperty.usage = PROPERTY_USAGE_READ_ONLY\n\t\n\tif property.name == \"knob_scale\" and not use_textures:\n\t\tproperty.usage = PROPERTY_USAGE_READ_ONLY\n\t\n\tif property.name == \"knob_rotation\" and not use_textures:\n\t\tproperty.usage = PROPERTY_USAGE_READ_ONLY\n\t\n\t\n\tif property.name == \"background_scale\" and not use_textures:\n\t\tproperty.usage = PROPERTY_USAGE_READ_ONLY\n\t\n\tif property.name == \"backround_rotation\" and not use_textures:\n\t\tproperty.usage = PROPERTY_USAGE_READ_ONLY\n\t\n\n# draws the joystick\nfunc _draw() -> void:\n\tif not use_textures:\n\t\tdraw_default_joystick()\n\telse:\n\t\tdraw_textured_joystick()\n\t\n\tif draw_debugs:\n\t\tdraw_debug()\n\n\n# default joystick\nfunc draw_default_joystick() -> void:\n\tdraw_set_transform(size / 2)\n\t# background\n\tdraw_circle(Vector2.ZERO, base_radius, background_color, true, -1.0, anti_aliased)\n\t\n\t# base\n\tdraw_circle(Vector2.ZERO, base_radius, base_color, false, base_thickness, anti_aliased)\n\tvar pos := knob_position\n\t# knob\n\tdraw_circle(pos, knob_radius, knob_color, true, -1.0, anti_aliased)\n\n\n# draw joystick using custom textures\nfunc draw_textured_joystick() -> void:\n\tif background_texture:\n\t\tvar texture_size := background_texture.get_size()\n\t\tvar centered_base_pos := size / 2\n\t\tdraw_set_transform(centered_base_pos, deg_to_rad(backround_rotation), Vector2(background_scale, background_scale))\n\t\tdraw_texture_rect(background_texture, Rect2(Vector2.ZERO - texture_size / 2, base_texture.get_size()), false)\n\t\t\n\t# draw textured base\n\tif base_texture:\n\t\tvar centered_base_pos := size / 2\n\t\tvar texture_size := base_texture.get_size()\n\t\tsize.x = clamp(size.x, texture_size.x, INF)\n\t\tsize.y = clamp(size.y, texture_size.y, INF)\n\t\tdraw_set_transform(centered_base_pos, deg_to_rad(base_rotation), Vector2(base_scale, base_scale))\n\t\tdraw_texture_rect(base_texture, Rect2(Vector2.ZERO - texture_size / 2, base_texture.get_size()), false)\n\t\n\t# draw texture knob\n\tif knob_texture:\n\t\tvar centered_knob_pos := size / 2\n\t\tvar texture_size := knob_texture.get_size()\n\t\t\n\t\tdraw_set_transform(centered_knob_pos, deg_to_rad(knob_rotation), Vector2(knob_scale, knob_scale))\n\t\tdraw_texture_rect(knob_texture, Rect2((knob_position / knob_scale) - (texture_size / 2), knob_texture.get_size()), false)\n\n\n# draws the deadzone and the current max length\nfunc draw_debug() -> void:\n\tvar length_string := str(round(get_weight() * 100.0), \"%\")\n\tvar string_pos := knob_position / 2 + Vector2.UP * 100\n\tvar lerped_color := lerp(Color.RED, Color.GREEN, get_weight()) as Color\n\tdraw_set_transform(size / 2)\n\t# draw deadzone\n\tdraw_circle(Vector2.ZERO, deadzone, deadzone_color, false, 1.0, true)\n\t\n\t# draw current max length\n\tdraw_circle(Vector2.ZERO, get_current_max_length(), current_max_length_color, false, 1.0, true)\n\t\n\tdraw_line(Vector2.ZERO, knob_position, lerped_color, 3.0, true)\n\tdraw_string_outline(SystemFont.new(), string_pos, length_string, HORIZONTAL_ALIGNMENT_CENTER, -1.0, 18, 10, Color.BLACK)\n\t@warning_ignore(\"narrowing_conversion\")\n\tdraw_string(SystemFont.new(), string_pos, length_string, HORIZONTAL_ALIGNMENT_CENTER, -1.0, 18, lerped_color, get_weight())\n\n\n# handles input\nfunc _input(event: InputEvent) -> void:\n\t# check if touching\n\tif event is InputEventScreenTouch:\n\t\t# checks if touch is pressed\n\t\tif event.pressed:\n\t\t\t# if touch is pressed, checks first if there's currently no touch index and the touch position has a point --\n\t\t\t# -- or is inside the rect\n\t\t\tif finger_index == -1 and get_global_rect().has_point(event.position):\n\t\t\t\t# sets the touch index to the event index\n\t\t\t\tfinger_index = event.index\n\t\t\t\tif event.index == finger_index:\n\t\t\t\t\ton_touched(event)\n\t\t\t\t\t# sets the touch position to event position subtracted to the center position\n\t\t\t\t\t# so the touch position starts from the center of the rect instead of --\n\t\t\t\t\t# the top left corner of the rect, then divide it to scale.x so the \n\t\t\t\t\t# position keeps centered regardless of the current scale\n\t\t\t\t\tglobal_touch = (event.position - global_position) / get_global_transform().get_scale().x\n\t\t\t\t\tget_viewport().set_input_as_handled()\n\t\telse:\n\t\t\t# resets the touch index and touch position\n\t\t\tif event.index == finger_index:\n\t\t\t\tfinger_index = -1\n\t\t\t\tglobal_touch = Vector2.ZERO\n\t\t\t\ton_touch_released()\n\t\t\t\tget_viewport().set_input_as_handled()\n\t\n\t# update the position when touch is moving\n\tif event is InputEventScreenDrag:\n\t\tif event.index == finger_index:\n\t\t\tglobal_touch = (event.position - global_position) / get_global_transform().get_scale().x\n\t\t\tget_viewport().set_input_as_handled()\n\n\nfunc on_touched(event: InputEventScreenTouch) -> void:\n\tis_pressing = true\n\tchange_opacity()\n\tvar mouse_pos := event.position - size / 2\n\tif mode == 1:\n\t\tposition = mouse_pos\n\n\nfunc on_touch_released() -> void:\n\tis_pressing = false\n\tif mode == 1:\n\t\tposition = default_pos\n\trelease_input_actions()\n\tchange_opacity()\n\n\n# returns the direction\nfunc get_vector() -> Vector2:\n\treturn get_center_pos().direction_to(knob_position + get_center_pos())\n\n\n# returns the direction affected by the deadzone\nfunc get_deadzoned_vector() -> Vector2:\n\tvar vector: Vector2\n\tif is_pressing and not is_in_deadzone():\n\t\tvector = get_center_pos().direction_to(knob_position + get_center_pos())\n\telse:\n\t\tvector = Vector2.ZERO\n\treturn vector\n\n\n# returns a position that starts at the center of the rect\nfunc get_center_pos() -> Vector2:\n\treturn position + size / 2\n\n\n# returns the distance from center of the joystick to the position of the knob\nfunc get_distance() -> float:\n\treturn (global_touch - size / 2).distance_to(Vector2.ZERO)\n\n\n# get the current max distance of the knob's position. --\n# -- if you use textures, the current max length will --\n# -- automatically set to the half base texture's width\nfunc get_current_max_length() -> float:\n\tvar curr_max_length: float\n\tif not use_textures:\n\t\tcurr_max_length = base_radius\n\telse:\n\t\tif use_custom_max_length:\n\t\t\tcurr_max_length = max_length\n\t\telif not use_custom_max_length and base_texture:\n\t\t\tcurr_max_length = (base_texture.get_size().x / 2) * base_scale\n\t\n\treturn curr_max_length\n\n\n# changes the opacity when touched\nfunc change_opacity() -> void:\n\tif change_opacity_when_touched and not Engine.is_editor_hint():\n\t\tif is_pressing:\n\t\t\tmodulate.a = to_opacity / 100.0\n\t\telse:\n\t\t\tmodulate.a = from_opacity / 100.0\n\telse:\n\t\tmodulate.a = 1.0\n\n\nfunc is_in_deadzone() -> bool:\n\treturn get_distance() <= deadzone\n\n\nfunc is_correct_event_index(event: InputEventScreenTouch) -> bool:\n\treturn event is InputEventScreenTouch and event.index == finger_index\n\n\nfunc is_touch_in_rect(touch_pos: Vector2) -> bool:\n\treturn get_global_rect().has_point(touch_pos)\n\n\nfunc get_weight() -> float:\n\tvar weight := (get_distance() / get_current_max_length())\n\tweight = clamp(weight, 0, 1)\n\treturn weight\n"
  },
  {
    "path": "sample/scenes/UI/touch_screen_joystick.gd.uid",
    "content": "uid://cgmpdyovn5vfm\n"
  },
  {
    "path": "sample/scenes/UIView/UIView.gd",
    "content": "class_name UIView\nextends VBoxContainer\n\n@onready var friends_visible_label = %FriendsVisibleLabel\n\n@onready var notification_location_btn = %NotificationLocationBtn\n@onready var notification_location_label = %NotificationLocationLabel\n\n@onready var get_toggle_friends_key_btn = %GetToggleFriendsKeyBtn\n@onready var get_toggle_friends_key_label = %GetToggleFriendsKeyLabel\n\n@onready var show_friends_btn = %ShowFriendsBtn\n@onready var show_block_player_btn = %ShowBlockPlayerBtn\n@onready var show_report_player_btn = %ShowReportPlayerBtn\n\nfunc _ready() -> void:\n\tnotification_location_btn.pressed.connect(_on_notification_location_btn_pressed)\n\tget_toggle_friends_key_btn.pressed.connect(_on_get_toggle_friends_key_btn)\n\tshow_friends_btn.pressed.connect(_on_show_friends_btn_pressed)\n\tshow_block_player_btn.pressed.connect(_on_show_block_player_btn_pressed)\n\tshow_report_player_btn.pressed.connect(_on_show_report_player_btn_pressed)\n\n\tIEOS.ui_interface_display_settings_updated_callback.connect(_on_display_settings_updated_callback)\n\nfunc _on_notification_location_btn_pressed():\n\tvar notification_location = EOS.UI.UIInterface.get_notification_location_preference()\n\tnotification_location_label.text = EOS.UI.NotificationLocation.keys()[notification_location]\n\nfunc _on_get_toggle_friends_key_btn():\n\tvar opts = EOS.UI.GetToggleFriendsKeyOptions.new()\n\tvar toggle_friends_key = EOS.UI.UIInterface.get_toggle_friends_key(opts)\n\n\tvar key_combination = []\n\tvar keys = EOS.UI.KeyCombination.keys()\n\tfor key in keys:\n\t\tif key == \"None\" or key == \"Numpad0\": continue\n\t\tif toggle_friends_key&EOS.UI.KeyCombination[key] == EOS.UI.KeyCombination[key]:\n\t\t\tkey_combination.append(key)\n\tget_toggle_friends_key_label.text = \" + \".join(key_combination)\n\nfunc _on_show_friends_btn_pressed():\n\tvar options = EOS.UI.ShowFriendsOptions.new()\n\toptions.local_user_id = HAuth.epic_account_id\n\tEOS.UI.UIInterface.show_friends(options)\n\nfunc _on_show_block_player_btn_pressed():\n\tvar opts = EOS.UI.ShowBlockPlayerOptions.new()\n\topts.local_user_id = HAuth.epic_account_id\n\topts.target_user_id = HAuth.epic_account_id\n\tEOS.UI.UIInterface.show_block_player(opts)\n\tprint(\"--- UI: show_block_player_callback: \", EOS.result_str(await IEOS.ui_interface_show_block_player_callback))\n\nfunc _on_show_report_player_btn_pressed():\n\tvar opts = EOS.UI.ShowReportPlayerOptions.new()\n\topts.local_user_id = HAuth.epic_account_id\n\topts.target_user_id = HAuth.epic_account_id\n\tEOS.UI.UIInterface.show_report_player(opts)\n\tprint(\"--- UI: show_report_player_callback: \", EOS.result_str(await IEOS.ui_interface_show_report_player_callback))\n\nfunc _on_display_settings_updated_callback(data: Dictionary):\n#\tprint(\"--- UI: display_settings_updated_callback: \", data)\n\n\tif data.is_visible:\n\t\tfriends_visible_label.text = \"Friends Overlay Visible: Yes\"\n\telse:\n\t\tfriends_visible_label.text = \"Friends Overlay Visible: No\"\n"
  },
  {
    "path": "sample/scenes/UIView/UIView.gd.uid",
    "content": "uid://dja7fd2sotvig\n"
  },
  {
    "path": "sample/scenes/UIView/UIView.tscn",
    "content": "[gd_scene load_steps=4 format=3 uid=\"uid://b51w7a6ofuubp\"]\n\n[ext_resource type=\"Script\" uid=\"uid://dja7fd2sotvig\" path=\"res://scenes/UIView/UIView.gd\" id=\"1\"]\n[ext_resource type=\"LabelSettings\" uid=\"uid://dcb771ib3tfno\" path=\"res://styles/ViewTitleLabelSettings.tres\" id=\"2_pdqi2\"]\n[ext_resource type=\"PackedScene\" uid=\"uid://t8s6xh1ax7uy\" path=\"res://scenes/UI/PrimaryButton.tscn\" id=\"5\"]\n\n[node name=\"UIView\" type=\"VBoxContainer\"]\nanchors_preset = 15\nanchor_right = 1.0\nanchor_bottom = 1.0\nsize_flags_horizontal = 3\nsize_flags_vertical = 3\nscript = ExtResource(\"1\")\n\n[node name=\"Title\" type=\"Label\" parent=\".\"]\nlayout_mode = 2\nsize_flags_vertical = 1\ntext = \"UI\"\nlabel_settings = ExtResource(\"2_pdqi2\")\n\n[node name=\"VB\" type=\"VBoxContainer\" parent=\".\"]\nlayout_mode = 2\ntheme_override_constants/separation = 16\n\n[node name=\"HB\" type=\"HBoxContainer\" parent=\"VB\"]\nlayout_mode = 2\ntheme_override_constants/separation = 16\n\n[node name=\"FriendsVisibleLabel\" type=\"Label\" parent=\"VB/HB\"]\nunique_name_in_owner = true\nlayout_mode = 2\ntext = \"Friends Overlay Visible: ?\"\n\n[node name=\"HB2\" type=\"HBoxContainer\" parent=\"VB\"]\nlayout_mode = 2\ntheme_override_constants/separation = 16\n\n[node name=\"NotificationLocationBtn\" parent=\"VB/HB2\" instance=ExtResource(\"5\")]\nunique_name_in_owner = true\nlayout_mode = 2\nsize_flags_horizontal = 0\ntext = \"Get Notification Location\"\n\n[node name=\"NotificationLocationLabel\" type=\"Label\" parent=\"VB/HB2\"]\nunique_name_in_owner = true\nlayout_mode = 2\ntext = \"Click button to load data\"\n\n[node name=\"HB4\" type=\"HBoxContainer\" parent=\"VB\"]\nlayout_mode = 2\ntheme_override_constants/separation = 16\n\n[node name=\"GetToggleFriendsKeyBtn\" parent=\"VB/HB4\" instance=ExtResource(\"5\")]\nunique_name_in_owner = true\nlayout_mode = 2\nsize_flags_horizontal = 0\ntext = \"Get Toggle Friends Key\"\n\n[node name=\"GetToggleFriendsKeyLabel\" type=\"Label\" parent=\"VB/HB4\"]\nunique_name_in_owner = true\nlayout_mode = 2\ntext = \"Click button to load data\"\n\n[node name=\"HB3\" type=\"HBoxContainer\" parent=\"VB\"]\nlayout_mode = 2\ntheme_override_constants/separation = 16\n\n[node name=\"ShowFriendsBtn\" parent=\"VB/HB3\" instance=ExtResource(\"5\")]\nunique_name_in_owner = true\nlayout_mode = 2\nsize_flags_horizontal = 0\ntext = \"Show Friends Overlay\"\n\n[node name=\"HB5\" type=\"HBoxContainer\" parent=\"VB\"]\nlayout_mode = 2\ntheme_override_constants/separation = 16\n\n[node name=\"ShowBlockPlayerBtn\" parent=\"VB/HB5\" instance=ExtResource(\"5\")]\nunique_name_in_owner = true\nlayout_mode = 2\nsize_flags_horizontal = 0\ntext = \"Show Block Player\"\n\n[node name=\"HB6\" type=\"HBoxContainer\" parent=\"VB\"]\nlayout_mode = 2\ntheme_override_constants/separation = 16\n\n[node name=\"ShowReportPlayerBtn\" parent=\"VB/HB6\" instance=ExtResource(\"5\")]\nunique_name_in_owner = true\nlayout_mode = 2\nsize_flags_horizontal = 0\ntext = \"Show Report Player\"\n"
  },
  {
    "path": "sample/scripts/Env.gd",
    "content": "extends Node\n\nvar _env = {}\n\n\nfunc load_env(p_path := \"res://.env\"):\n\tif not FileAccess.file_exists(p_path):\n\t\treturn {}\n\n\tvar file = FileAccess.open(p_path, FileAccess.READ)\n\tvar ret = {}\n\twhile not file.eof_reached():\n\t\tvar line = file.get_line()\n\t\t# skip comment lines\n\t\tif line.lstrip(\" \").begins_with(\"#\"): continue\n\t\tvar tokens = line.split(\"=\", false, 1)\n\t\tif tokens.size() == 2:\n\t\t\tret[tokens[0]] = tokens[1].lstrip(\"\\\"\").rstrip(\"\\\"\");\n\treturn ret\n\n\nfunc _ready() -> void:\n\t_env = load_env()\n\n\nfunc get_var(p_name: String, p_default = null):\n\tif _env.has(p_name):\n\t\treturn _env[p_name]\n\treturn p_default\n"
  },
  {
    "path": "sample/scripts/Env.gd.uid",
    "content": "uid://bjyq7tcpdc3ac\n"
  },
  {
    "path": "sample/scripts/Store.gd",
    "content": "extends Node\n\n\n@warning_ignore(\"unused_signal\")\nsignal player_score_changed\n\n\nconst GAME_SOCKET_NAME = \"EOSGSAMPLE\"\nconst GROUP_PLAYER = \"GRP_PLAYER\"\nconst GROUP_MAP = \"GRP_MAP\"\n\nvar display_name = \"\"\n\n# For testing things that need a second player\nvar second_epic_account_id = \"e5d94c924f204a63bd343b976ae662cd\"\nvar second_product_user_id = \"0002620f4b524b099abf1b48db7137a2\"\n\nvar _main_node: Control\nvar network: MyNetwork\nvar current_lobby: HLobby\nvar shoot_joystick: TouchScreenJoystick\n\n\n@onready var is_mobile := OS.get_name() in [\"iOS\", \"Android\"]\n\n\nfunc get_view(view_name: String):\n\treturn _main_node.get_view_manager().get_view(view_name)\n\n\nfunc set_view(view_name: String):\n\treturn _main_node.get_view_manager().set_view(view_name)\n\n\n# NetworkImage cache\nvar network_image_cache = {\n\t# url: Texture\n}\n\n\nfunc get_new_random(arr: Array, cur = null):\n\tif arr.size() == 1:\n\t\treturn arr[0]\n\t\n\tvar new_elm = arr.pick_random()\n\twhile cur != null and cur == new_elm:\n\t\tnew_elm = arr.pick_random()\n\treturn new_elm\n"
  },
  {
    "path": "sample/scripts/Store.gd.uid",
    "content": "uid://b4qb3afy3c108\n"
  },
  {
    "path": "sample/scripts/ViewManager.gd",
    "content": "class_name ViewManager\nextends VBoxContainer\n\n\n@onready var auth_btn = %AuthBtn\n@onready var achievements_btn = %AchievementsBtn\n@onready var custominvites_btn = %CustomInvitesBtn\n@onready var stats_btn = %StatsBtn\n@onready var leaderboards_btn = %LeaderboardsBtn\n@onready var friends_btn = %FriendsBtn\n@onready var ui_btn = %UIBtn\n@onready var metrics_btn = %MetricsBtn\n@onready var lobbies_btn = %LobbiesBtn\n@onready var needs_login_btns = %NeedsLoginBtns\n\n\nfunc _ready() -> void:\n\t_disable_needs_login_btns()\n\tHAuth.logged_in.connect(_enable_needs_login_btns)\n\tHAuth.logged_out.connect(_disable_needs_login_btns)\n\n\tauth_btn.pressed.connect(Callable(self, \"set_view\").bind(\"Login\"))\n\tachievements_btn.pressed.connect(Callable(self, \"set_view\").bind(\"Achievements\"))\n\tcustominvites_btn.pressed.connect(Callable(self, \"set_view\").bind(\"CustomInvites\"))\n\tstats_btn.pressed.connect(Callable(self, \"set_view\").bind(\"Stats\"))\n\tleaderboards_btn.pressed.connect(Callable(self, \"set_view\").bind(\"Leaderboards\"))\n\tfriends_btn.pressed.connect(Callable(self, \"set_view\").bind(\"Friends\"))\n\tui_btn.pressed.connect(Callable(self, \"set_view\").bind(\"UI\"))\n\tmetrics_btn.pressed.connect(Callable(self, \"set_view\").bind(\"Metrics\"))\n\tlobbies_btn.pressed.connect(Callable(self, \"set_view\").bind(\"Lobbies\"))\n\n\nfunc get_view(view_name: String):\n\tif view_name == \"Logs\":\n\t\treturn $VSC/LogsView\n\n\telif view_name == \"Notifications\":\n\t\treturn $VSC/VB/NotificationsLayer/NotificationsView\n\n\treturn get_node(\"VSC/VB/\" + view_name + \"View\")\n\n\nfunc set_view(view_name: String):\n\tfor child in $VSC/VB.get_children():\n\t\tif child is CanvasItem:\n\t\t\tchild.visible = false\n\n\tget_view(view_name).visible = true\n\n\nfunc _disable_needs_login_btns():\n\tfor child in needs_login_btns.get_children():\n\t\tchild.disabled = true\n\n\nfunc _enable_needs_login_btns():\n\tfor child in needs_login_btns.get_children():\n\t\tchild.disabled = false\n"
  },
  {
    "path": "sample/scripts/ViewManager.gd.uid",
    "content": "uid://b8dbhfvrewi8w\n"
  },
  {
    "path": "sample/scripts/network.gd",
    "content": "class_name MyNetwork\nextends Node2D\n\n\nconst PLAYER = preload(\"res://game/entities/player/player.tscn\")\nconst MAP_BELLANDUR = preload(\"res://game/maps/map_bellandur.tscn\")\nconst MAP_MARGAO = preload(\"res://game/maps/map_margao.tscn\")\nconst MAP_NEW_YORK = preload(\"res://game/maps/map_new_york.tscn\")\n\n\n@onready var _player_spawner: MultiplayerSpawner = $Game/PlayerSpawner\n@onready var _network_spawn: Node2D = $Game/NetworkSpawn\n@onready var _mc: MarginContainer = $\"../MC\"\n@onready var _canvas_layer: CanvasLayer = $Game/CanvasLayer\n\n\nvar peer = EOSGMultiplayerPeer.new()\n\nfunc _ready() -> void:\n\tStore.network = self\n\t_player_spawner.spawn_function = _spawn_player\n\t_mc.show()\n\t_canvas_layer.hide()\n\n\nfunc create_server():\n\tprint(\"Creating server...\")\n\tpeer.create_server(Store.GAME_SOCKET_NAME)\n\tpeer.peer_connected.connect(_on_peer_connected)\n\tpeer.peer_disconnected.connect(_on_peer_disconnected)\n\tmultiplayer.multiplayer_peer = peer\n\n\nfunc start_game(map: LobbiesView.Maps):\n\tprint(\"Starting game: map=%s\" % LobbiesView.Maps.find_key(map))\n\t_spawn_map(map)\n\t_player_spawner.spawn({peer_id = 1, puid = HAuth.product_user_id})\n\t_show_map()\n\n\nfunc join_game(remote_puid: String):\n\tprint(\"Joining game: remote_puid=%s\" % remote_puid)\n\tpeer.create_client(Store.GAME_SOCKET_NAME, remote_puid)\n\tpeer.peer_disconnected.connect(_on_peer_disconnected)\n\tmultiplayer.multiplayer_peer = peer\n\t_show_map()\n\n\n@rpc(\"any_peer\", \"call_local\", \"reliable\")\nfunc add_score(peer_id: int, amt: int):\n\tvar player = _network_spawn.get_node(str(peer_id))\n\tif player:\n\t\tplayer.score += amt\n\tStore.player_score_changed.emit()\n\n\n\nfunc _on_peer_connected(peer_id: int):\n\tvar puid = peer.get_peer_user_id(peer_id)\n\tprint(\"server:: client connected: peer_id=%s, puid=%s\" % [peer_id, puid])\n\t_player_spawner.spawn({peer_id = peer_id, puid = puid})\n\n\nfunc _on_peer_disconnected(peer_id: int):\n\tif multiplayer.is_server():\n\t\tprint(\"server:: client disconnected: %s\" % peer_id)\n\t\t_remove_player_by_peer_id(peer_id)\n\telse:\n\t\tprint(\"client:: server disconnected\")\n\t\tmultiplayer.multiplayer_peer = null\n\n\nfunc _spawn_map(map: LobbiesView.Maps):\n\tvar map_node = null\n\tmatch map:\n\t\tLobbiesView.Maps.Margao:\n\t\t\tmap_node = MAP_MARGAO.instantiate()\n\t\tLobbiesView.Maps.Bellandur:\n\t\t\tmap_node = MAP_BELLANDUR.instantiate()\n\t\tLobbiesView.Maps.NewYork:\n\t\t\tmap_node = MAP_NEW_YORK.instantiate()\n\tif map_node:\n\t\t_network_spawn.add_child(map_node, true)\n\n\nfunc _spawn_player(data: Dictionary):\n\tvar peer_id = data.peer_id\n\tvar puid = data.puid\n\t\n\tvar player: Player = PLAYER.instantiate()\n\tplayer.name = str(peer_id)\n\tplayer.peer_id = peer_id\n\tplayer.puid = puid\n\t\n\tplayer.global_position = _get_player_spawn_point().global_position\n\tplayer.died.connect(_on_player_died)\n\t\n\treturn player\n\n\nfunc _remove_player_by_peer_id(peer_id: int):\n\tvar players = get_tree().get_nodes_in_group(Store.GROUP_PLAYER)\n\tfor player: Player in players:\n\t\tif player.peer_id == peer_id:\n\t\t\tplayer.queue_free()\n\n\nfunc _on_player_died(player: Player, _killing_peer_id: int):\n\tif player.is_multiplayer_authority():\n\t\tprint(\"Respawning player: peer_id=%s, puid=%s\" % [player.peer_id, player.puid])\n\t\tplayer.global_position = _get_random_spawn_point().global_position\n\t\tplayer.health = 100\n\n\nfunc _show_map():\n\tshow()\n\t_mc.hide()\n\t_canvas_layer.show()\n\n\nfunc _get_random_spawn_point() -> Node2D:\n\tvar map = get_tree().get_nodes_in_group(Store.GROUP_MAP)[0]\n\tvar total_spawn_points = map.get_node(\"SpawnPoints\").get_child_count()\n\treturn map.get_node(\"SpawnPoints\").get_child(randi_range(0, total_spawn_points - 1))\n\t\n\t\nfunc _get_player_spawn_point() -> Node2D:\n\tvar map = get_tree().get_nodes_in_group(Store.GROUP_MAP)[0]\n\tvar total_spawn_points = map.get_node(\"SpawnPoints\").get_child_count()\n\tvar idx = get_tree().get_nodes_in_group(Store.GROUP_PLAYER).size() % total_spawn_points\n\treturn map.get_node(\"SpawnPoints\").get_child(idx)\n"
  },
  {
    "path": "sample/scripts/network.gd.uid",
    "content": "uid://d0vgtesnrato5\n"
  },
  {
    "path": "sample/styles/ViewTitleLabelSettings.tres",
    "content": "[gd_resource type=\"LabelSettings\" load_steps=2 format=3 uid=\"uid://dcb771ib3tfno\"]\n\n[ext_resource type=\"FontFile\" uid=\"uid://djdr1hyqtgka6\" path=\"res://fonts/Roboto-Bold.ttf\" id=\"1_d1ecq\"]\n\n[resource]\nfont = ExtResource(\"1_d1ecq\")\nfont_size = 24\n"
  },
  {
    "path": "sample/test.gd",
    "content": "extends Node\n\n@onready var IS_ANTICHEAT_SERVER: String = Env.get_var(\"IS_ANTICHEAT_SERVER\", \"false\")\n\nvar anticheat_server_main: AntiCheatServerMain = null\n\n\nfunc _ready() -> void:\n\tif IS_ANTICHEAT_SERVER != \"false\":\n\t\tanticheat_server_main = AntiCheatServerMain.new()\n\t\tadd_child(anticheat_server_main)\n\t\treturn\n\n\t# For dev testing\n\tHAuth.logged_in.connect(_on_tab_pressed)\n\n\nfunc _input(event: InputEvent) -> void:\n\tif event is InputEventKey and event.pressed:\n\t\tif event.keycode == KEY_QUOTELEFT: # Press ` (backtick) key to toggle Logs\n\t\t\tStore.get_view(\"Logs\").visible = not Store.get_view(\"Logs\").visible\n\t\telif event.keycode == KEY_TAB:\n\t\t\t# Press tab key to run dev testing stuff\n\t\t\t_on_tab_pressed()\n\n\n# Dev testing stuff\nfunc _on_tab_pressed():\n\tprint(\"Tab pressed\")\n\n\t# test_auth_interface()\n\t# test_connect_interface()\n\t# test_ecom_interface()\n\t# test_kws_interface()\n\t# test_mods_interface()\n\t# test_platform_interface()\n\t# test_playerdatastorage_interface()\n\t# test_presence_interface()\n\t# test_progression_snapshot_interface()\n\t# test_reports_interface()\n\t# test_sanctions_interface()\n\t# test_sessions_interface()\n\t# test_titlestorage_interface()\n\t# test_user_info_interface()\n\t# test_rtc_interface()\n\t# test_anticheat_server_interface()\n\t# test_anticheat_client_interface()\n\nfunc test_auth_interface():\n\tprint(\"--- Auth: get_logged_in_accounts_count: \", EOS.Auth.AuthInterface.get_logged_in_accounts_count())\n\tprint(\"--- Auth: Logged in account by index(0): \", EOS.Auth.AuthInterface.get_logged_in_account_by_index(0))\n\tprint(\"--- Auth: get_login_status: \", EOS.Auth.AuthInterface.get_login_status(HAuth.epic_account_id))\n\tprint(\"--- Auth: get_merged_accounts_count: \", EOS.Auth.AuthInterface.get_merged_accounts_count(HAuth.epic_account_id))\n\tprint(\"--- Auth: Get merged account by index(0): \", EOS.Auth.AuthInterface.get_merged_account_by_index(HAuth.epic_account_id, 0))\n\tprint(\"--- Auth: get_selected_account_id: \", EOS.Auth.AuthInterface.get_selected_account_id(HAuth.epic_account_id))\n\n\tvar copy_user_auth_token = EOS.Auth.AuthInterface.copy_user_auth_token(EOS.Auth.CopyUserAuthTokenOptions.new(), HAuth.epic_account_id)\n\tvar token = copy_user_auth_token.token\n\tvar verify_user_auth_options = EOS.Auth.VerifyUserAuthOptions.new()\n\tverify_user_auth_options.auth_token = token\n\tEOS.Auth.AuthInterface.verify_user_auth(verify_user_auth_options)\n\tvar verify_user_auth_ret = await IEOS.auth_interface_verify_user_auth_callback\n\tprint(\"--- Auth: verify_user_auth: \", verify_user_auth_ret)\n\n\tvar copy_id_token_options = EOS.Auth.CopyIdTokenOptions.new()\n\tcopy_id_token_options.account_id = HAuth.epic_account_id\n\tprint(\"--- Auth: copy_id_token: \", EOS.result_str(EOS.Auth.AuthInterface.copy_id_token(copy_id_token_options)))\n\nfunc test_platform_interface():\n\tprint(\"--- Platform: get_active_country_code: \", EOS.Platform.PlatformInterface.get_active_country_code(HAuth.epic_account_id))\n\tprint(\"--- Platform: get_active_locale_code: \", EOS.Platform.PlatformInterface.get_active_locale_code(HAuth.epic_account_id))\n\tprint(\"--- Platform: get_override_country_code: \", EOS.Platform.PlatformInterface.get_override_country_code())\n\tprint(\"--- Platform: get_override_locale_code: \", EOS.Platform.PlatformInterface.get_override_locale_code())\n\nfunc test_connect_interface():\n\tvar opts12 = EOS.Connect.QueryProductUserIdMappingsOptions.new()\n\topts12.product_user_ids = [Store.second_product_user_id]\n\tEOS.Connect.ConnectInterface.query_product_user_id_mappings(opts12)\n\tvar res12 = await IEOS.connect_interface_query_product_user_id_mappings_callback\n\tprint(\"--- Connect: query_product_user_id_mappings: \", _get_res_if_sucess(res12))\n\t\n\tvar opts4 = EOS.Connect.CopyProductUserInfoOptions.new()\n\tprint(\"--- Connect: copy_product_user_info: \", EOS.Connect.ConnectInterface.copy_product_user_info(opts4))\n\n\tvar opts11 = EOS.Connect.QueryExternalAccountMappingsOptions.new()\n\topts11.account_id_type = EOS.ExternalAccountType.Epic\n\topts11.external_account_ids = [Store.second_epic_account_id]\n\tEOS.Connect.ConnectInterface.query_external_account_mappings(opts11)\n\tvar res11 = await IEOS.connect_interface_query_external_account_mappings_callback\n\tprint(\"--- Connect: query_external_account_mappings: \", _get_res_if_sucess(res11))\n\t\n\tvar opts1 = EOS.Connect.CopyProductUserExternalAccountByAccountIdOptions.new()\n\topts1.account_id = Store.second_epic_account_id\n\tvar res1 = EOS.Connect.ConnectInterface.copy_product_user_external_account_by_account_id(opts1)\n\tprint(\"--- Connect: copy_product_user_external_account: By account Id: \", _get_res_if_sucess(res1))\n\n\tvar opts2 = EOS.Connect.CopyProductUserExternalAccountByAccountTypeOptions.new()\n\topts2.account_id_type = EOS.ExternalAccountType.Epic\n\tvar res2 = EOS.Connect.ConnectInterface.copy_product_user_external_account_by_account_type(opts2)\n\tprint(\"--- Connect: copy_product_user_external_account: By account type: \", _get_res_if_sucess(res2))\n\n\tvar opts3 = EOS.Connect.CopyProductUserExternalAccountByIndexOptions.new()\n\topts3.external_account_info_index = 0\n\tvar res3 = EOS.Connect.ConnectInterface.copy_product_user_external_account_by_index(opts3)\n\tprint(\"--- Connect: copy_product_user_external_account: By account index: \", _get_res_if_sucess(res3))\n\t\n\t#var opts5 = EOS.Connect.CopyIdTokenOptions.new()\n\t#var ret5 = EOS.Connect.ConnectInterface.copy_id_token(opts5)\n\t#var id_token = EOS.Connect.IdToken.new()\n\t#id_token.json_web_token = ret5.id_token.json_web_token\n\t#id_token.product_user_id = ret5.id_token.product_user_id\n\t#print(\"-- Connect: copy_id_token: Id token: \", id_token)\n\n\t#var opts10 = EOS.Connect.VerifyIdTokenOptions.new()\n\t#opts10.id_token = id_token\n\t#EOS.Connect.ConnectInterface.verify_id_token(opts10)\n\t#print(\"--- Connect: verify_id_token: \", await IEOS.connect_interface_verify_id_token_callback)\n\n\tvar opts6 = EOS.Connect.GetExternalAccountMappingsOptions.new()\n\topts6.account_id_type = EOS.ExternalAccountType.Epic\n\topts6.target_external_user_id = Store.second_epic_account_id\n\tprint(\"--- Connect: get_external_account_mapping: \", EOS.Connect.ConnectInterface.get_external_account_mapping(opts6))\n\n\tprint(\"--- Connect: get_logged_in_user_by_index(0): \", EOS.Connect.ConnectInterface.get_logged_in_user_by_index(0))\n\tprint(\"--- Connect: get_logged_in_users_count: \", EOS.Connect.ConnectInterface.get_logged_in_users_count())\n\tprint(\"--- Connecet: get_login_status: \", EOS.Connect.ConnectInterface.get_login_status(HAuth.product_user_id))\n\n\tvar opts7 = EOS.Connect.GetProductUserExternalAccountCountOptions.new()\n\tprint(\"--- Connect: get_product_user_external_account_count: \", EOS.Connect.ConnectInterface.get_product_user_external_account_count(opts7))\n\n\tvar opts8 = EOS.Connect.GetProductUserIdMappingOptions.new()\n\topts8.account_id_type = EOS.ExternalAccountType.Discord\n\topts8.target_product_user_id = \"External Account Id Here\"\n\tprint(\"--- Connect: get_product_user_id_mapping: \", EOS.Connect.ConnectInterface.get_product_user_id_mapping(opts8))\n\n\t#var opts9 = EOS.Connect.LinkAccountOptions.new()\n\t#opts9.continuance_token = ContinunanceTokenEOSG object here\n\t#EOS.Connect.ConnectInterface.link_account(opts9)\n\t#print(\"--- Connect: link_account: \", _get_res_if_success(await IEOS.connect_interface_link_account_callback))\n\n\nfunc test_ecom_interface():\n\tvar offers_options = EOS.Ecom.QueryOffersOptions.new()\n\tEOS.Ecom.EcomInterface.query_offers(offers_options)\n\tprint(\"--- Ecom: query_offers: \", await IEOS.ecom_interface_query_offers_callback)\n\n\tvar checkout_options = EOS.Ecom.CheckoutOptions.new()\n\tcheckout_options.entries = [ {\n\t\toffer_id = \"OFFER ID HERE\"\n\t}]\n\tEOS.Ecom.EcomInterface.checkout(checkout_options)\n\tvar checkout_data = await IEOS.ecom_interface_checkout_callback\n\tprint(\"--- Ecom: checkout: \", checkout_data)\n\nfunc test_user_info_interface():\n\tvar opts1 = EOS.UserInfo.QueryUserInfoOptions.new()\n\tEOS.UserInfo.UserInfoInterface.query_user_info(opts1)\n\tprint(\"--- UserInfo: query_user_info: \", EOS.result_str(await IEOS.user_info_interface_query_user_info_callback))\n\n\tvar opts2 = EOS.UserInfo.CopyUserInfoOptions.new()\n\tprint(\"--- UserInfo: copy_user_info: \", EOS.UserInfo.UserInfoInterface.copy_user_info(opts2))\n\n\tvar opts3 = EOS.UserInfo.QueryUserInfoByDisplayNameOptions.new()\n\topts3.display_name = \"3ddelano\"\n\tEOS.UserInfo.UserInfoInterface.query_user_info_by_display_name(opts3)\n\tprint(\"--- UserInfo: query_user_info_by_display_name: \", EOS.result_str(await IEOS.user_info_interface_query_user_info_by_display_name_callback))\n\n\tvar opts4 = EOS.UserInfo.QueryUserInfoByExternalAccountOptions.new()\n\topts4.account_type = EOS.ExternalAccountType.Epic\n\topts4.external_account_id = HAuth.epic_account_id\n\tEOS.UserInfo.UserInfoInterface.query_user_info_by_external_account(opts4)\n\tprint(\"--- UserInfo: query_user_info_by_external_account: \", EOS.result_str(await IEOS.user_info_interface_query_user_info_by_external_account_callback))\n\n\tvar opts5 = EOS.UserInfo.CopyExternalUserInfoByAccountIdOptions.new()\n\topts5.account_id = HAuth.epic_account_id\n\tprint(\"--- UserInfo: copy_external_user_info_by_account_id: \", EOS.UserInfo.UserInfoInterface.copy_external_user_info_by_account_id(opts5))\n\n\tvar opts6 = EOS.UserInfo.CopyExternalUserInfoByAccountTypeOptions.new()\n\topts6.account_type = EOS.ExternalAccountType.Epic\n\tEOS.UserInfo.UserInfoInterface.copy_external_user_info_by_account_type(opts6)\n\n\tvar opts7 = EOS.UserInfo.CopyExternalUserInfoByIndexOptions.new()\n\topts7.index = 0\n\tEOS.UserInfo.UserInfoInterface.copy_external_user_info_by_index(opts7)\n\n\tvar opts8 = EOS.UserInfo.GetExternalUserInfoCountOptions.new()\n\tEOS.UserInfo.UserInfoInterface.get_external_user_info_count(opts8)\n\nfunc test_mods_interface():\n\tvar opts1 = EOS.Mods.EnumerateModsOptions.new()\n\topts1.type = EOS.Mods.ModEnumerationType.AllAvailable\n\tEOS.Mods.ModsInterface.enumerate_mods(opts1)\n\tprint(\"--- Mods: enumerate_mods: \", EOS.result_str(await IEOS.mods_interface_enumerate_mods_callback))\n\n\tvar opts2 = EOS.Mods.CopyModInfoOptions.new()\n\topts2.type = EOS.Mods.ModEnumerationType.AllAvailable\n\tvar copy_mods_info_data = EOS.Mods.ModsInterface.copy_mod_info(opts2)\n\tprint(\"--- Mods: copy_mod_info: \", copy_mods_info_data)\n\n\tvar mod = {}\n\tif copy_mods_info_data.mods != null:\n\t\tmod = copy_mods_info_data.mods.mods[0]\n\n\tvar opts3 = EOS.Mods.InstallModOptions.new()\n\topts3.mod = mod\n\tEOS.Mods.ModsInterface.install_mod(opts3)\n\tprint(\"--- Mods: install_mod: \", EOS.result_str(await IEOS.mods_interface_install_mod_callback))\n\nfunc test_reports_interface():\n\tvar report_options = EOS.Reports.SendPlayerBehaviorReportOptions.new()\n\treport_options.reported_user_id = Store.second_product_user_id\n\treport_options.category = EOS.Reports.PlayerReportsCategory.Cheating\n\treport_options.message = \"this is a test report from godot\"\n\treport_options.context = JSON.stringify({hello = \"testing\"})\n\tEOS.Reports.ReportsInterface.send_player_behavior_report(report_options)\n\tprint(\"--- Reports: send_player_behavior_report: \", EOS.result_str(await IEOS.reports_interface_send_player_behavior_report_callback))\n\nfunc test_progression_snapshot_interface():\n\tvar opts1 = EOS.ProgressionSnapshot.BeginSnapshotOptions.new()\n\tvar begin_snapshot_ret = EOS.ProgressionSnapshot.ProgressionSnapshotInterface.begin_snapshot(opts1)\n\tprint(\"--- ProgressionSnapshot: begin_snapshot: \", EOS.result_str(begin_snapshot_ret))\n\n\tvar key_values = {\n\t\ttest_key = \"test_value\",\n\t\thealth = \"100\",\n\t\tpos_x = \"-158.6\",\n\t\tpos_y = \"14.7\"\n\t}\n\tfor key in key_values:\n\t\tvar opts2 = EOS.ProgressionSnapshot.AddProgressionOptions.new()\n\t\topts2.snapshot_id = begin_snapshot_ret.snapshot_id\n\t\topts2.key = key\n\t\topts2.value = str(key_values[key])\n\t\tprint(\"--- ProgressionSnapshot: add_progression: \", EOS.result_str(EOS.ProgressionSnapshot.ProgressionSnapshotInterface.add_progression(opts2)))\n\n\tvar opts3 = EOS.ProgressionSnapshot.SubmitSnapshotOptions.new()\n\topts3.snapshot_id = begin_snapshot_ret.snapshot_id\n\tEOS.ProgressionSnapshot.ProgressionSnapshotInterface.submit_snapshot(opts3)\n\tprint(\"--- ProgressionSnapshot: submit_snapshot_callback: \", EOS.result_str(await IEOS.progression_snapshot_interface_submit_snapshot_callback))\n\n\tvar opts4 = EOS.ProgressionSnapshot.DeleteSnapshotOptions.new()\n\tEOS.ProgressionSnapshot.ProgressionSnapshotInterface.delete_snapshot(opts4)\n\tprint(\"--- ProgressionSnapshot: delete_snapshot_callback: \", EOS.result_str(await IEOS.progression_snapshot_interface_delete_snapshot_callback))\n\nfunc test_presence_interface():\n\tvar opts1 = EOS.Presence.CreatePresenceModificationOptions.new()\n\tvar create_pmod_ret = EOS.Presence.PresenceInterface.create_presence_modification(opts1)\n\tprint(\"--- Presence: create_presence_modification: \", EOS.result_str(create_pmod_ret))\n\n\tvar presence_modification: EOSGPresenceModification = create_pmod_ret.presence_modification\n\tvar set_data_ret = presence_modification.set_data({\n\t\ttest_key = \"test_val\",\n\t\thello = \"world\"\n\t})\n\tprint(\"--- EOSGPresenceModification: set_data: \", EOS.result_str(set_data_ret))\n\n\tvar delete_data_ret = presence_modification.delete_data([\"hello\"])\n\tprint(\"--- EOSGPresenceModification: delete_data: \", EOS.result_str(delete_data_ret))\n\n\tvar set_join_info_ret = presence_modification.set_join_info(\"this is sample join info\")\n\tprint(\"--- EOSGPresenceModification: set_join_info: \", EOS.result_str(set_join_info_ret))\n\n\tvar set_raw_rich_text_ret = presence_modification.set_raw_rich_text(\"this is sample join info\")\n\tprint(\"--- EOSGPresenceModification: set_raw_rich_text: \", EOS.result_str(set_raw_rich_text_ret))\n\n\tvar set_status_ret = presence_modification.set_status(EOS.Presence.Status.Online)\n\tprint(\"--- EOSGPresenceModification: set_status: \", EOS.result_str(set_status_ret))\n\n\tvar opts6 = EOS.Presence.SetPresenceOptions.new()\n\topts6.presence_modification = presence_modification\n\tEOS.Presence.PresenceInterface.set_presence(opts6)\n\tprint(\"--- Presence: set_presence: \", EOS.result_str(await IEOS.presence_interface_set_presence_callback))\n\n\tvar opts2 = EOS.Presence.GetJoinInfoOptions.new()\n\tvar get_join_info_ret = EOS.Presence.PresenceInterface.get_join_info(opts2)\n\tprint(\"--- Presence: get_join_info: \", EOS.result_str(get_join_info_ret))\n\n\tvar opts3 = EOS.Presence.HasPresenceOptions.new()\n\tvar has_presence_ret: bool = EOS.Presence.PresenceInterface.has_presence(opts3)\n\tprint(\"--- Presence: has_presence: \", has_presence_ret)\n\n\tvar opst4 = EOS.Presence.QueryPresenceOptions.new()\n\tEOS.Presence.PresenceInterface.query_presence(opst4)\n\tprint(\"--- Presence: query_presence: \", EOS.result_str(await IEOS.presence_interface_query_presence_callback))\n\n\tvar opts5 = EOS.Presence.CopyPresenceOptions.new()\n\tvar copy_presence_ret = EOS.Presence.PresenceInterface.copy_presence(opts5)\n\tprint(\"--- Presence: copy_presence: \", EOS.result_str(copy_presence_ret))\n\tprint(JSON.stringify(copy_presence_ret, \"\\t\", true, true))\n\nfunc test_kws_interface():\n\tvar opts1 = EOS.KWS.CreateUserOptions.new()\n\topts1.parent_email = \"3ddelano1@gmail.com\"\n\topts1.date_of_birth = \"2002-01-01\"\n\tEOS.KWS.KWSInterface.create_user(opts1)\n\tvar create_user_ret = await IEOS.kws_interface_create_user_callback\n\tprint(\"--- KWS: create_user_callback: \", EOS.result_str(create_user_ret))\n\n\tvar opts2 = EOS.KWS.QueryPermissionsOptions.new()\n\tEOS.KWS.KWSInterface.query_permissions(opts2)\n\tprint(\"--- KWS: query_permissions_callback: \", await IEOS.kws_interface_query_permissions_callback)\n\n\t# EOS.KWS.KWSInterface.get_permissions_count()\n\t# EOS.KWS.KWSInterface.get_permission_by_key()\n\t# KWS.KWSInterface.copy_permission_by_index()\n\n\t# KWS.KWSInterface.query_age_gate()\n\t# EOS.KWS.KWSInterface.request_permissions()\n\t# EOS.KWS.KWSInterface.update_parent_email()\n\nfunc test_playerdatastorage_interface():\n\t# var query_file_opts = EOS.PlayerDataStorage.QueryFileOptions.new()\n\t# query_file_opts.filename = \"testfile-001.txt\"\n\t# EOS.PlayerDataStorage.PlayerDataStorageInterface.query_file(query_file_opts)\n\t# print(\"--- PlayerDataStorage: query_file: \", await IEOS.playerdatastorage_interface_query_file_callback)\n\n\t# var query_file_list_opts = EOS.PlayerDataStorage.QueryFileListOptions.new()\n\t# EOS.PlayerDataStorage.PlayerDataStorageInterface.query_file_list(query_file_list_opts)\n\t# print(\"--- PlayerDataStorage: query_file_list: \", await IEOS.playerdatastorage_interface_query_file_list_callback)\n\n\t# var get_meta_count_opts = EOS.PlayerDataStorage.GetFileMetadataCountOptions.new()\n\t# print(\"--- PlayerDataStorage: get_file_metadata_count: \", EOS.PlayerDataStorage.PlayerDataStorageInterface.get_file_metadata_count(get_meta_count_opts))\n\n\t# var copy_meta_at_index_opts = EOS.PlayerDataStorage.CopyFileMetadataAtIndexOptions.new()\n\t# copy_meta_at_index_opts.index = 0\n\t# print(\"--- PlayerDataStorage: copy_file_metadata_at_index: \", EOS.PlayerDataStorage.PlayerDataStorageInterface.copy_file_metadata_at_index(copy_meta_at_index_opts))\n\n\t# var copy_meta_by_filename_opts = EOS.PlayerDataStorage.CopyFileMetadataByFilenameOptions.new()\n\t# copy_meta_by_filename_opts.filename = \"testfile-001.txt\"\n\t# print(\"--- PlayerDataStorage: copy_file_metadata_by_filename: \", EOS.PlayerDataStorage.PlayerDataStorageInterface.copy_file_metadata_by_filename(copy_meta_by_filename_opts))\n\n\t# var duplicate_opts = EOS.PlayerDataStorage.DuplicateFileOptions.new()\n\t# duplicate_opts.source_filename = \"testfile-001.txt\"\n\t# duplicate_opts.destination_filename = \"testfile-001-copy.txt\"\n\t# EOS.PlayerDataStorage.PlayerDataStorageInterface.duplicate_file(duplicate_opts)\n\t# print(\"--- PlayerDataStorage: duplicate_file: \", await IEOS.playerdatastorage_interface_duplicate_file_callback)\n\n\t# var delete_file_opts = EOS.PlayerDataStorage.DeleteFileOptions.new()\n\t# delete_file_opts.filename = \"testfile-001-copy.txt\"\n\t# EOS.PlayerDataStorage.PlayerDataStorageInterface.delete_file(delete_file_opts)\n\t# print(\"--- PlayerDataStorage: delete_file: \", await IEOS.playerdatastorage_interface_delete_file_callback)\n\n\t# var delete_cache_opts = EOS.PlayerDataStorage.DeleteCacheOptions.new()\n\t# EOS.PlayerDataStorage.PlayerDataStorageInterface.delete_cache(delete_cache_opts)\n\t# print(\"--- PlayerDataStorage: delete_cache: \", await IEOS.playerdatastorage_interface_delete_cache_callback)\n\n\tIEOS.playerdatastorage_interface_file_transfer_progress_callback.connect(func(data):\n\t\tprint(\"--- PlayerDataStorage: file_transfer_progress_callback: \", data)\n\t)\n\tIEOS.playerdatastorage_interface_write_file_callback.connect(func(data):\n\t\tprint(\"--- PlayerDataStorage: write_file_callback: \", data)\n\t)\n\tIEOS.playerdatastorage_interface_write_file_data_callback.connect(func(data):\n\t\tprint(\"--- PlayerDataStorage: write_file_data_callback: \", data)\n\t)\n\tIEOS.playerdatastorage_interface_read_file_callback.connect(func(data):\n\t\tprint(\"--- PlayerDataStorage: read_file_callback: \", data)\n\t)\n\tIEOS.playerdatastorage_interface_read_file_data_callback.connect(func(data):\n\t\tprint(\"--- PlayerDataStorage: read_file_data_callback: \", data)\n\t)\n\n\tvar write_file_opts = EOS.PlayerDataStorage.WriteFileOptions.new()\n\twrite_file_opts.filename = \"testfile-002.txt\"\n\twrite_file_opts.data = PackedByteArray([65, 66, 67])\n\tvar _write_transfer_request: EOSGFileTransferRequest = EOS.PlayerDataStorage.PlayerDataStorageInterface.write_file(write_file_opts)\n\t# write_transfer_request.cancel_request()\n\tawait IEOS.playerdatastorage_interface_write_file_callback\n\n\tprint(\"Reading file\")\n\tvar read_file_opts = EOS.PlayerDataStorage.ReadFileOptions.new()\n\tread_file_opts.filename = \"testfile-002.txt\"\n\tvar _read_transfer_request: EOSGFileTransferRequest = EOS.PlayerDataStorage.PlayerDataStorageInterface.read_file(read_file_opts)\n\t# print(read_transfer_request.get_filename())\n\t# print(read_transfer_request.cancel_request())\n\nfunc test_titlestorage_interface():\n\tIEOS.titlestorage_interface_file_transfer_progress_callback.connect(func(data):\n\t\tprint(\"--- TitleStorage: file_transfer_progress_callback: \", data)\n\t)\n\tIEOS.titlestorage_interface_read_file_callback.connect(func(data):\n\t\tprint(\"--- TitleStorage: read_file_callback: \", data)\n\t)\n\tIEOS.titlestorage_interface_read_file_data_callback.connect(func(data):\n\t\tprint(\"--- TitleStorage: read_file_data_callback: \", data)\n\t)\n\n\tvar read_file_opts = EOS.TitleStorage.ReadFileOptions.new()\n\tread_file_opts.filename = \"title-001.txt\"\n\tvar _read_transfer_request: EOSGFileTransferRequest = EOS.TitleStorage.TitleStorageInterface.read_file(read_file_opts)\n\t#print(read_transfer_request.get_filename())\n\t#print(read_transfer_request.cancel_request())\n\n\tvar query_file_opts = EOS.TitleStorage.QueryFileOptions.new()\n\tquery_file_opts.filename = \"title-001.txt\"\n\tEOS.TitleStorage.TitleStorageInterface.query_file(query_file_opts)\n\tprint(\"--- TitleStorage: query_file: \", await IEOS.titlestorage_interface_query_file_callback)\n\n\tvar query_file_list_opts = EOS.TitleStorage.QueryFileListOptions.new()\n\tquery_file_list_opts.list_of_tags = [\"hey\"]\n\tEOS.TitleStorage.TitleStorageInterface.query_file_list(query_file_list_opts)\n\tprint(\"--- TitleStorage: query_file_list: \", await IEOS.titlestorage_interface_query_file_list_callback)\n\n\tvar get_meta_count_opts = EOS.TitleStorage.GetFileMetadataCountOptions.new()\n\tprint(\"--- TitleStorage: get_file_metadata_count: \", EOS.TitleStorage.TitleStorageInterface.get_file_metadata_count(get_meta_count_opts))\n\n\tvar copy_meta_at_index_opts = EOS.TitleStorage.CopyFileMetadataAtIndexOptions.new()\n\tcopy_meta_at_index_opts.index = 0\n\tprint(\"--- TitleStorage: copy_file_metadata_at_index: \", EOS.TitleStorage.TitleStorageInterface.copy_file_metadata_at_index(copy_meta_at_index_opts))\n\n\tvar copy_meta_by_filename_opts = EOS.TitleStorage.CopyFileMetadataByFilenameOptions.new()\n\tcopy_meta_by_filename_opts.filename = \"title-001.txt\"\n\tprint(\"--- TitleStorage: copy_file_metadata_by_filename: \", EOS.TitleStorage.TitleStorageInterface.copy_file_metadata_by_filename(copy_meta_by_filename_opts))\n\n\tvar delete_cache_opts = EOS.TitleStorage.DeleteCacheOptions.new()\n\tEOS.TitleStorage.TitleStorageInterface.delete_cache(delete_cache_opts)\n\tprint(\"--- TitleStorage: delete_cache: \", await IEOS.titlestorage_interface_delete_cache_callback)\n\nfunc test_sanctions_interface():\n\tvar query_active_sanctions_opts = EOS.Sanctions.QueryActivePlayerSanctionsOptions.new()\n\tEOS.Sanctions.SanctionsInterface.query_active_player_sanctions(query_active_sanctions_opts)\n\n\tprint(\"--- Sanctions: query_active_player_sanctions: \", await IEOS.sanctions_interface_query_active_player_sanctions_callback)\n\n\tvar get_player_sanction_count_opts = EOS.Sanctions.GetPlayerSanctionCountOptions.new()\n\tvar sanctions_count = EOS.Sanctions.SanctionsInterface.get_player_sanction_count(get_player_sanction_count_opts)\n\tprint(\"--- Sanctions: get_active_player_sanction_count: \", sanctions_count)\n\n\tfor i in range(sanctions_count):\n\t\tvar copy_active_sanction_by_index_opts = EOS.Sanctions.CopyPlayerSanctionByIndexOptions.new()\n\t\tcopy_active_sanction_by_index_opts.sanction_index = i\n\t\tprint(\"--- Sanctions: copy_active_player_sanction_by_index(%s): \" % i, EOS.Sanctions.SanctionsInterface.copy_player_sanction_by_index(copy_active_sanction_by_index_opts))\n\nfunc test_sessions_interface():\n\tvar bucket_id = \"mode:region01:map01\"\n\n\tvar create_sess_mod_opts = EOS.Sessions.CreateSessionModificationOptions.new()\n\tcreate_sess_mod_opts.session_name = \"TestSession001\"\n\tcreate_sess_mod_opts.bucket_id = bucket_id\n\tcreate_sess_mod_opts.max_players = 16\n\tcreate_sess_mod_opts.presence_enabled = true\n\tcreate_sess_mod_opts.sanctions_enabled = false\n\tvar create_sess_mod = EOS.Sessions.SessionsInterface.create_session_modification(create_sess_mod_opts)\n\tprint(\"--- Sessions: create_session_modification: \", create_sess_mod)\n\n\tvar session_mod: EOSGSessionModification = create_sess_mod.session_modification\n\n\tprint(\"--- Sessions: SessionModification: set_permission_level: \", EOS.result_str(session_mod.set_permission_level(EOS.Sessions.OnlineSessionPermissionLevel.PublicAdvertised)))\n\tprint(\"--- Sessions: SessionModification: set_join_in_progess_allowed: \", EOS.result_str(session_mod.set_join_in_progress_allowed(true)))\n\tprint(\"--- Sessions: SessionModification: set_invites_allowed: \", EOS.result_str(session_mod.set_invites_allowed(true)))\n\tprint(\"--- Sessions: SessionModification: add_attribute: \", EOS.result_str(session_mod.add_attribute(EOS.Sessions.SEARCH_BUCKET_ID, bucket_id, EOS.Sessions.SessionAttributeAdvertisementType.Advertise)))\n\n\tvar update_sess_opts = EOS.Sessions.UpdateSessionOptions.new()\n\tupdate_sess_opts.session_modification = session_mod\n\tEOS.Sessions.SessionsInterface.update_session(update_sess_opts)\n\tsession_mod = null\n\n\tvar update_sess = await IEOS.sessions_interface_update_session_callback\n\tprint(\"--- Sessions: update_session: \", update_sess)\n\n\tvar dump_sess_opts = EOS.Sessions.DumpSessionStateOptions.new()\n\tdump_sess_opts.session_name = \"TestSession001\"\n\tprint(\"--- Sessions: dump_session_state: \", EOS.result_str(EOS.Sessions.SessionsInterface.dump_session_state(dump_sess_opts)))\n\n\tvar copy_active_session_opts = EOS.Sessions.CopyActiveSessionDetailsOptions.new()\n\tcopy_active_session_opts.session_name = \"TestSession001\"\n\tvar copy_active_session = EOS.Sessions.SessionsInterface.copy_active_session_details(copy_active_session_opts)\n\tprint(\"--- Sessions: copy_active_session_details: \", copy_active_session)\n\n\tvar active_session: EOSGActiveSession = copy_active_session.active_session\n\tprint(\"--- Sessions: ActiveSession: copy_info:\", active_session.copy_info())\n\n\t# Update session\n\tvar update_sess_mod_opts = EOS.Sessions.UpdateSessionModificationOptions.new()\n\tupdate_sess_mod_opts.session_name = \"TestSession001\"\n\tvar update_sess_mod = EOS.Sessions.SessionsInterface.update_session_modification(update_sess_mod_opts)\n\tprint(\"--- Sessions: update_session_modification: \", update_sess_mod)\n\tsession_mod = update_sess_mod.session_modification\n\tprint(\"--- Sessions: SessionModification: set_invites_allowed: \", session_mod.set_invites_allowed(false))\n\tupdate_sess_opts = EOS.Sessions.UpdateSessionOptions.new()\n\tupdate_sess_opts.session_modification = session_mod\n\tEOS.Sessions.SessionsInterface.update_session(update_sess_opts)\n\tupdate_sess = await IEOS.sessions_interface_update_session_callback\n\tprint(\"--- Sessions: update_session: \", update_sess)\n\n\t# Search session\n\tvar create_search_opts = EOS.Sessions.CreateSessionSearchOptions.new()\n\tvar create_session_search = EOS.Sessions.SessionsInterface.create_session_search(create_search_opts)\n\tprint(\"--- Sessions: create_session_search: \", create_session_search)\n\n\tvar session_search: EOSGSessionSearch = create_session_search.session_search\n\tsession_search.set_parameter(EOS.Sessions.SEARCH_BUCKET_ID, bucket_id, EOS.ComparisonOp.Equal)\n\tsession_search.find(EOSGRuntime.local_product_user_id)\n\tprint(\"--- Sessions: SessionSearch: find: \", await IEOS.session_search_find_callback)\n\n\tvar search_result_count = session_search.get_search_result_count()\n\tprint(\"--- Sessions: SessionSearch: get_search_result_count: \", search_result_count)\n\n\tfor i in range(search_result_count):\n\t\tvar search_result = session_search.copy_search_result_by_index(i)\n\t\tprint(\"--- Sessions: copy_search_result_by_index(%d): \" % i, search_result)\n\n\t\tvar session_details: EOSGSessionDetails = search_result.session_details\n\t\tprint(\"--- Sessions: SessionDetails: copy_info: \", session_details.copy_info())\n\n\t# # Join session\n\t# var join_sess_opts = EOS.Sessions.JoinSessionOptions.new()\n\t# join_sess_opts.session_name = \"TestSession001\"\n\t# join_sess_opts.presence_enabled = true\n\t# join_sess_opts.session_details = EOSGSesssionDetails here\n\t# EOS.Sessions.SessionsInterface.join_session(join_sess_opts)\n\t# print(\"--- Sessions: join_session: \", await IEOS.sessions_interface_join_session_callback)\n\n\t# Register players\n\tvar reg_players_opts = EOS.Sessions.RegisterPlayersOptions.new()\n\treg_players_opts.session_name = \"TestSession001\"\n\treg_players_opts.players_to_register = [EOSGRuntime.local_product_user_id]\n\tEOS.Sessions.SessionsInterface.register_players(reg_players_opts)\n\tprint(\"--- Sessions: register_players: \", await IEOS.sessions_interface_register_players_callback)\n\n\t# Start session\n\tvar start_sess_opts = EOS.Sessions.StartSessionOptions.new()\n\tstart_sess_opts.session_name = \"TestSession001\"\n\tEOS.Sessions.SessionsInterface.start_session(start_sess_opts)\n\tprint(\"--- Sessions: start_session: \", await IEOS.sessions_interface_start_session_callback)\n\n\t# # Destroy session\n\t# var destroy_sess_opts = EOS.Sessions.DestroySessionOptions.new()\n\t# destroy_sess_opts.session_name = \"TestSession001\"\n\t# EOS.Sessions.SessionsInterface.destroy_session(destroy_sess_opts)\n\t# print(\"--- Sessions: destroy_session: \", await IEOS.sessions_interface_destroy_session_callback)\n\nfunc test_rtc_interface():\n\t#TODO: test rtc interface\n\tpass\n\nfunc test_anticheat_server_interface():\n\tIEOS.anticheatserver_interface_message_to_client_callback.connect(func(data):\n\t\tprint(\"--- AntiCheatServer: message_to_client_callback: \", data)\n\t)\n\n\tIEOS.anticheatserver_interface_client_action_required_callback.connect(func(data):\n\t\tprint(\"--- AntiCheatServer: client_action_required_callback: \", data)\n\t)\n\n\tIEOS.anticheatserver_interface_client_auth_status_changed_callback.connect(func(data):\n\t\tprint(\"--- AntiCheatServer: client_auth_status_changed_callback: \", data)\n\t)\n\n\tvar begin_sess_opts = EOS.AntiCheatServer.BeginSessionOptions.new()\n\tbegin_sess_opts.register_timeout_seconds = 60\n\tbegin_sess_opts.server_name = \"Godot 4.2+ server\"\n\tbegin_sess_opts.enable_gameplay_data = false\n\n\tprint(\"--- AntiCheatServer: begin_session: \", EOS.AntiCheatServer.AntiCheatServerInterface.begin_session(begin_sess_opts))\n\n\t#print(\"--- AntiCheatServer: end_session: \", EOS.AntiCheatServer.AntiCheatServerInterface.end_session())\n\n\tvar reg_client_opts = EOS.AntiCheatServer.RegisterClientOptions.new()\n\treg_client_opts.client_handle = \"client001\"\n\treg_client_opts.client_type = EOS.AntiCheatCommonClientType.ProtectedClient\n\treg_client_opts.client_platform = EOS.AntiCheatCommonClientPlatform.Windows\n\treg_client_opts.ip_address = \"192.168.4.1\"\n\treg_client_opts.user_id = EOSGRuntime.local_product_user_id\n\n\tprint(\"--- AntiCheatServer: register_client: \", EOS.AntiCheatServer.AntiCheatServerInterface.register_client(reg_client_opts))\n\n\nfunc test_anticheat_client_interface():\n\tvar copy_id_token_opts = EOS.Connect.CopyIdTokenOptions.new()\n\tvar id_token_ret = EOS.Connect.ConnectInterface.copy_id_token(copy_id_token_opts)\n\n\tvar jwt = id_token_ret.id_token.json_web_token\n\tvar product_user_id = id_token_ret.id_token.product_user_id\n\n\tIEOS.anticheat_client_interface_message_to_server_callback.connect(func(data):\n\t\tlogger(\"--- AntiCheatClient: message_to_server_callback: \" + str(data))\n\t)\n\n\tvar begin_sess_opts = EOS.AntiCheatClient.BeginSessionOptions.new()\n\tbegin_sess_opts.mode = EOS.AntiCheatClientMode.ClientServer\n\tbegin_sess_opts.local_user_id = product_user_id\n\tlogger(\"--- AntiCheatClient: begin_session: \" + EOS.result_str(EOS.AntiCheatClient.AntiCheatClientInterface.begin_session(begin_sess_opts)))\n\n\tmultiplayer.connected_to_server.connect(func():\n\t\tlogger(\"--- AntiCheatClient:: connected_to_server\")\n\t\t_send_msg_to_server.rpc_id(1, product_user_id, jwt, EOS.AntiCheatCommonClientPlatform.Windows)\n\t)\n\tmultiplayer.server_disconnected.connect(func():\n\t\tlogger(\"--- AntiCheatClient:: server_disconnected\")\n\t)\n\n\tvar peer = ENetMultiplayerPeer.new()\n\tpeer.create_client(\"127.0.0.1\", 12345)\n\tmultiplayer.multiplayer_peer = peer\n\n\n@rpc(\"any_peer\", \"reliable\", \"call_remote\")\nfunc _send_msg_to_server(local_user_id: String, jwt: String, mode: int):\n\tvar peer_id = multiplayer.get_remote_sender_id()\n\tprint(\"--- AntiCheatServer: _send_msg_to_server: got rpc: peer: %s, local_user_id: %d\" % [peer_id, local_user_id])\n\tif anticheat_server_main:\n\t\tanticheat_server_main.on_client_message_receive(peer_id, \"register\", {\n\t\t\tlocal_user_id = local_user_id,\n\t\t\tjwt = jwt,\n\t\t\tmode = mode\n\t\t})\n\n\nfunc _get_res_if_sucess(res: Dictionary):\n\tif EOS.is_success(res):\n\t\treturn res\n\telse:\n\t\treturn EOS.result_str(res)\n\n\nfunc logger(msg: String):\n\tvar logs = Store.get_view(\"Logs\")\n\tlogs.log_msg(EOS.Logging.LogLevel.Info, msg)\n"
  },
  {
    "path": "sample/test.gd.uid",
    "content": "uid://bb2nerxdrhped\n"
  },
  {
    "path": "sample/test_manual_audio_output.gd",
    "content": "# This script is an example of using EOS manual audio output and input.\n# In this sample, user2 will automatically create a lobby\n# and user1 will join that lobby.\n# Now once in the lobby:\n#    user2's voice will be sent via EOS to user1.\n#    And user2's voice will be heard by user1\n#    using manual audio output.\n#    Audio output is muted for user2 to prevent loopback so\n#    that you can test on the same device.\n#\n# In user2's window, hold T to speak.\n# The audio should be heard in user1's window.\n#\n# To run this sample, uncomment the _run() line in _ready() method\nextends Node\n\n\n# Provide 2 different Product User IDs for testing\nvar user1_puid = \"\"\nvar user2_puid = Store.second_product_user_id\n\n\nconst BUCKET_ID = \"test_manual_audio_output\"\n\n\nvar _lobby: HLobby\nvar _connected_lobby_signals = false\nvar _rtc_room_name = \"\"\n\nvar player_voices = {}\n\n\n# for audio input\nvar _audio_input: AudioStreamPlayer\nvar _audio_effect_capture: AudioEffectCapture\nvar _audio_bus_index: int\nconst SAMPLE_RATE = 48000\nconst CHANNELS = 1\nconst CHUNK_DURATION_MS = 10 # 10 milliseconds\nconst FRAMES_PER_CHUNK = int(SAMPLE_RATE * CHUNK_DURATION_MS / 1000.0) # 480 frames\n\n# Recording state\nvar is_recording = false\nvar audio_buffer = PackedFloat32Array()\n\n# Voice activity detection (optional)\nvar voice_threshold = 0.01 # Adjust based on your needs\nvar silence_frames = 0\nvar max_silence_frames = 10 # Stop recording after this many silent chunks\n\n\nfunc _ready():\n\t# Uncomment the below line to run this sample\n\t#_run()\n\tpass\n\n\nfunc _run():\n\tIEOS.rtc_audio_audio_before_render.connect(_on_rtc_audio_audio_before_render)\n\t\n\tawait HAuth.logged_in\n\t\n\tif is_user2():\n\t\t_setup_audio_capture()\n\t\n\tprint(\"Running the EOS manual audio output sample\")\n\t\n\tHLobbies.local_rtc_options.use_manual_audio_output = true\n\t\n\tif EOSGRuntime.local_product_user_id == user2_puid:\n\t\t_run_user2()\n\telse:\n\t\t_run_user1()\n\n\nfunc _run_user1():\n\t_log(\"Running as user1\")\n\t\n\t_log(\"waiting for lobby to be created\")\n\tawait get_tree().create_timer(5).timeout\n\t\n\t_log(\"searching for lobbies now\")\n\tvar lobbies: Array = await HLobbies.search_by_product_user_id_async(user2_puid)\n\t\n\t_log(\"found lobbies count: \", len(lobbies))\n\tif len(lobbies) > 0:\n\t\tvar most_recent: HLobby = lobbies.back()\n\t\t_lobby = await HLobbies.join_async(most_recent)\n\t\t_log(\"joined lobby with id \", most_recent.lobby_id)\n\t\t_on_lobby_joined()\n\n\nfunc _run_user2():\n\t_log(\"Running as user2\")\n\t\n\tvar create_opts := EOS.Lobby.CreateLobbyOptions.new()\n\tcreate_opts.bucket_id = \"test_manual_audio_output\"\n\tcreate_opts.max_lobby_members = 4\n\tcreate_opts.presence_enabled = true\n\tcreate_opts.enable_rtc_room = true\n\tcreate_opts.permission_level = EOS.Lobby.LobbyPermissionLevel.PublicAdvertised\n\tcreate_opts.allow_invites = true\n\tcreate_opts.local_rtc_options = {\n\t\tflags = EOS.RTC.JoinRoomFlags.EnableDataChannel,\n\t\tuse_manual_audio_input = true,\n\t\tuse_manual_audio_output = true,\n\t}\n\t_lobby = await HLobbies.create_lobby_async(create_opts)\n\t_log(\"created lobby with id \", _lobby.lobby_id)\n\t_on_lobby_joined()\n\n\nfunc _on_lobby_joined():\n\t_lobby.lobby_updated.connect(_on_lobby_updated)\n\n\nfunc _on_lobby_updated():\n\tif _lobby.rtc_room_name and not _connected_lobby_signals:\n\t\t_connected_lobby_signals = true\n\t\t_connect_rtc_signals()\n\n\nfunc _connect_rtc_signals():\n\t_rtc_room_name = _lobby.rtc_room_name\n\t_log(\"Got rtc room name: \", _rtc_room_name)\n\n\tif not is_user2():\n\t\t_log(\"setting up manual audio output for user1\")\n\t\tvar opts = EOS.RTCAudio.AddNotifyAudioBeforeRenderOptions.new()\n\t\topts.unmixed_audio = true\n\t\topts.room_name = _rtc_room_name\n\t\tEOS.RTCAudio.RTCAudioInterface.add_notify_audio_before_render(opts)\n\t\t\n\t\t# create the audio stream player node to hear user2's voice\n\t\t\n\t\t# AudioStreamGenerator for real-time audio streaming\n\t\tvar stream_generator = AudioStreamGenerator.new()\n\t\tstream_generator.mix_rate = 48000 # 48000 is what EOS gives\n\t\tstream_generator.buffer_length = 0.01 # 10ms buffer is what EOS gives\n\t\t\n\t\tvar audio_player = AudioStreamPlayer.new()\n\t\tadd_child(audio_player)\n\t\taudio_player.stream = stream_generator\n\t\taudio_player.autoplay = true\n\t\taudio_player.play()\n\t\t\n\t\tplayer_voices[user2_puid] = {\n\t\t\taudio_player = audio_player,\n\t\t\tplayback = audio_player.get_stream_playback()\n\t\t}\n\n\nfunc _setup_audio_capture():\n\t_log(\"Setting up capturing microphone audio\")\n\t# Get the microphone input bus\n\t_audio_bus_index = AudioServer.get_bus_index(\"Microphone\")\n\t# Get the audio effect capture\n\t_audio_effect_capture = AudioServer.get_bus_effect(_audio_bus_index, 0)\n\t\n\t# Create AudioStreamPlayer for microphone input\n\t_audio_input = AudioStreamPlayer.new()\n\tadd_child(_audio_input)\n\t\n\t# Set up microphone input\n\tvar microphone_stream = AudioStreamMicrophone.new()\n\t_audio_input.stream = microphone_stream\n\t_audio_input.bus = \"Microphone\"\n\n\nfunc _on_rtc_audio_audio_before_render(data: Dictionary):\n\tvar puid = data.participant_id\n\tif puid in player_voices:\n\t\t#_log(\"got audio before render: for player: \", puid)\n\t\tvar buffer_data = data.buffer\n\t\tvar playback = player_voices[puid].playback\n\t\t\n\t\t# Convert the frame data to audio samples\n\t\tvar frames = buffer_data[\"frames\"]\n\t\t@warning_ignore(\"unused_variable\")\n\t\tvar sample_rate = buffer_data[\"sample_rate\"]\n\t\t@warning_ignore(\"unused_variable\")\n\t\tvar channels = buffer_data[\"channels\"]\n\t\t\n\t\t# Create PackedVector2Array for audio data (required by AudioStreamGeneratorPlayback)\n\t\tvar audio_data = PackedVector2Array()\n\t\t\n\t\t# Convert integer frames to float samples (normalize to -1.0 to 1.0 range)\n\t\t# Assuming the frames are 16-bit integers (-32768 to 32767)\n\t\tfor frame in frames:\n\t\t\tvar sample = float(frame) / 32768.0\n\t\t\t# For mono audio, use the same sample for both left and right channels\n\t\t\taudio_data.append(Vector2(sample, sample))\n\t\t\n\t\t# Push the audio data to the stream\n\t\tplayback.push_buffer(audio_data)\n\n\nfunc _process(_delta: float):\n\tif not is_user2():\n\t\treturn\n\t\n\tif not is_recording:\n\t\treturn\n\t\n\t# Get available audio frames\n\tvar available_frames = _audio_effect_capture.get_frames_available()\n\t\n\tif available_frames >= FRAMES_PER_CHUNK:\n\t\t# Capture audio chunk\n\t\tvar audio_data = _audio_effect_capture.get_buffer(FRAMES_PER_CHUNK)\n\t\tprocess_audio_chunk(audio_data)\n\n\nfunc start_voice_recording():\n\tif is_recording or not _audio_input:\n\t\treturn\n\t\n\tis_recording = true\n\taudio_buffer.clear()\n\t\n\t# Start microphone recording\n\t_audio_input.play()\n\t\n\t# Enable audio capture\n\t_audio_effect_capture.clear_buffer()\n\t_log(\"Voice recording started\")\n\n\nfunc stop_voice_recording():\n\tif not is_recording or not _audio_input:\n\t\treturn\n\t\n\tis_recording = false\n\t_audio_input.stop()\n\t\n\t_log(\"Voice recording stopped\")\n\n\nfunc process_audio_chunk(audio_data: PackedVector2Array):\n\t# Convert stereo Vector2 data to mono float array\n\tvar mono_samples = PackedFloat32Array()\n\t\n\tfor sample in audio_data:\n\t\t# Convert stereo to mono by averaging left and right channels\n\t\tvar mono_sample = (sample.x + sample.y) / 2.0\n\t\tmono_samples.append(mono_sample)\n\t\n\t# Convert to 16-bit integer format\n\tvar frames_16bit = convert_to_16bit(mono_samples)\n\t\t\n\t# Broadcast the voice data\n\tvar send_opts = EOS.RTCAudio.SendAudioOptions.new()\n\tsend_opts.room_name = _rtc_room_name\n\tsend_opts.frames = PackedInt32Array(frames_16bit)\n\t\n\tvar send_res = EOS.RTCAudio.RTCAudioInterface.send_audio(send_opts)\n\tif not EOS.is_success(send_res):\n\t\t_log(\"Failed to send audio data code=\", EOS.result_str(send_res))\n\t\treturn\n\telse:\n\t\t_log(\"Send audio success\")\n\n\nfunc convert_to_16bit(float_samples: PackedFloat32Array) -> Array:\n\tvar int_samples = []\n\t\n\tfor sample in float_samples:\n\t\t# Clamp sample to [-1.0, 1.0] range\n\t\tsample = clamp(sample, -1.0, 1.0)\n\t\t\n\t\t# Convert to 16-bit integer (-32768 to 32767)\n\t\tvar int_sample = int(sample * 32767.0)\n\t\tint_samples.append(int_sample)\n\t\n\treturn int_samples\n\n\nfunc has_voice_activity(samples: PackedFloat32Array) -> bool:\n\t# Simple voice activity detection based on RMS (Root Mean Square)\n\tvar rms = 0.0\n\t\n\tfor sample in samples:\n\t\trms += sample * sample\n\t\n\trms = sqrt(rms / samples.size())\n\t\n\treturn rms > voice_threshold\n\n\nfunc _input(_event: InputEvent) -> void:\n\tif Input.is_action_just_pressed(&\"push_to_talk\"):\n\t\tstart_voice_recording()\n\tif Input.is_action_just_released(&\"push_to_talk\"):\n\t\tstop_voice_recording()\n\n\n#region internals\n\nfunc _log_only_user1(v0, v1 = null):\n\t_log(v0, v1, user1_puid)\n\n\nfunc _log_only_user2(v0, v1 = null):\n\t_log(v0, v1, user2_puid)\n\n\nfunc is_user2() -> bool:\n\treturn HAuth.product_user_id == user2_puid\n\nfunc _log(v0, v1 = null, only_user_with_puid = null):\n\tvar user_num = \"2\" if is_user2() else \"1\"\n\t\n\tif only_user_with_puid and only_user_with_puid != HAuth.product_user_id:\n\t\treturn\n\t\n\tif v1 == null:\n\t\tprint(\"user:: \" + str(user_num) + \":: \", v0)\n\telse:\n\t\tprint(\"user:: \" + str(user_num) + \":: \", v0, v1)\n\n#endregion\n"
  },
  {
    "path": "sample/test_manual_audio_output.gd.uid",
    "content": "uid://k3lb65sounwm\n"
  },
  {
    "path": "src/achievements_interface.cpp",
    "content": "#include \"ieos.h\"\n\nusing namespace godot;\n\nDictionary IEOS::achievements_interface_copy_achievement_definition_v2_by_achievement_id(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_achievementsInterface, {});\n    CharString achievement_id = VARIANT_TO_CHARSTRING(p_options->get(\"achievement_id\"));\n\n    EOS_Achievements_CopyAchievementDefinitionV2ByAchievementIdOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ACHIEVEMENTS_COPYACHIEVEMENTDEFINITIONV2BYACHIEVEMENTID_API_LATEST;\n    options.AchievementId = achievement_id.get_data();\n\n    EOS_Achievements_DefinitionV2 *outDefinition = nullptr;\n    EOS_EResult res = EOS_Achievements_CopyAchievementDefinitionV2ByAchievementId(s_achievementsInterface, &options, &outDefinition);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"definition_v2\"] = eosg_achievements_definition_to_dict_and_release(outDefinition);\n    return ret;\n}\n\nDictionary IEOS::achievements_interface_copy_achievement_definition_v2_by_index(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_achievementsInterface, {});\n    EOS_Achievements_CopyAchievementDefinitionV2ByIndexOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ACHIEVEMENTS_COPYACHIEVEMENTDEFINITIONV2BYINDEX_API_LATEST;\n    options.AchievementIndex = static_cast<uint32_t>(static_cast<int>(p_options->get(\"achievement_index\")));\n\n    EOS_Achievements_DefinitionV2 *outDefinition = nullptr;\n    EOS_EResult res = EOS_Achievements_CopyAchievementDefinitionV2ByIndex(s_achievementsInterface, &options, &outDefinition);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"definition_v2\"] = eosg_achievements_definition_to_dict_and_release(outDefinition);\n    return ret;\n}\n\nDictionary IEOS::achievements_interface_copy_player_achievement_by_achievement_id(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_achievementsInterface, {});\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString target_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"target_user_id\"));\n    CharString achievement_id = VARIANT_TO_CHARSTRING(p_options->get(\"achievement_id\"));\n\n    EOS_Achievements_CopyPlayerAchievementByAchievementIdOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ACHIEVEMENTS_COPYPLAYERACHIEVEMENTBYACHIEVEMENTID_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.TargetUserId = eosg_string_to_product_user_id(target_user_id.get_data());\n    options.AchievementId = achievement_id.get_data();\n\n    EOS_Achievements_PlayerAchievement *outAchievement = nullptr;\n    EOS_EResult res = EOS_Achievements_CopyPlayerAchievementByAchievementId(s_achievementsInterface, &options, &outAchievement);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"player_achievement\"] = eosg_achievements_player_achievement_to_dict_and_release(outAchievement);\n    return ret;\n}\n\nDictionary IEOS::achievements_interface_copy_player_achievement_by_index(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_achievementsInterface, {});\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString target_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"target_user_id\"));\n\n    EOS_Achievements_CopyPlayerAchievementByIndexOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ACHIEVEMENTS_COPYPLAYERACHIEVEMENTBYINDEX_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.TargetUserId = eosg_string_to_product_user_id(target_user_id.get_data());\n    options.AchievementIndex = static_cast<uint32_t>(static_cast<int>(p_options->get(\"achievement_index\")));\n\n    EOS_Achievements_PlayerAchievement *outAchievement = nullptr;\n    EOS_EResult res = EOS_Achievements_CopyPlayerAchievementByIndex(s_achievementsInterface, &options, &outAchievement);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"player_achievement\"] = eosg_achievements_player_achievement_to_dict_and_release(outAchievement);\n    return ret;\n}\n\nint IEOS::achievements_interface_get_achievement_definition_count(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_achievementsInterface, 0);\n    EOS_Achievements_GetAchievementDefinitionCountOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ACHIEVEMENTS_GETACHIEVEMENTDEFINITIONCOUNT_API_LATEST;\n\n    return static_cast<int>(EOS_Achievements_GetAchievementDefinitionCount(s_achievementsInterface, &options));\n}\n\nvoid IEOS::achievements_interface_query_definitions(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_achievementsInterface);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n\n    EOS_Achievements_QueryDefinitionsOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ACHIEVEMENTS_QUERYDEFINITIONS_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    p_options->reference();\n\n    EOS_Achievements_QueryDefinitions(s_achievementsInterface, &options, (void *)*p_options, [](const EOS_Achievements_OnQueryDefinitionsCompleteCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        IEOS::get_singleton()->emit_signal(\"achievements_interface_query_definitions_callback\", ret);\n    });\n}\n\nint IEOS::achievements_interface_get_player_achievement_count(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_achievementsInterface, 0);\n    CharString user_id = VARIANT_TO_CHARSTRING(p_options->get(\"user_id\"));\n\n    EOS_Achievements_GetPlayerAchievementCountOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ACHIEVEMENTS_GETPLAYERACHIEVEMENTCOUNT_API_LATEST;\n    options.UserId = eosg_string_to_product_user_id(user_id.get_data());\n\n    return static_cast<int>(EOS_Achievements_GetPlayerAchievementCount(s_achievementsInterface, &options));\n}\n\nvoid IEOS::achievements_interface_query_player_achievements(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_achievementsInterface);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString target_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"target_user_id\"));\n\n    EOS_Achievements_QueryPlayerAchievementsOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ACHIEVEMENTS_QUERYPLAYERACHIEVEMENTS_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.TargetUserId = eosg_string_to_product_user_id(target_user_id.get_data());\n    p_options->reference();\n\n    EOS_Achievements_QueryPlayerAchievements(s_achievementsInterface, &options, (void *)*p_options, [](const EOS_Achievements_OnQueryPlayerAchievementsCompleteCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n        ret[\"target_user_id\"] = eosg_product_user_id_to_string(data->TargetUserId);\n        IEOS::get_singleton()->emit_signal(\"achievements_interface_query_player_achievements_callback\", ret);\n    });\n}\n\nvoid IEOS::achievements_interface_unlock_achievements(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_achievementsInterface);\n    CharString user_id = VARIANT_TO_CHARSTRING(p_options->get(\"user_id\"));\n    Array p_achievement_ids = p_options->get(\"achievement_ids\");\n    int achievement_ids_count = p_achievement_ids.size();\n\n    PERSISTENT_CHAR_ARRAY_CREATE(achievement_ids, achievement_id_charstrings, achievement_ids_count)\n    for (int i = 0; i < achievement_ids_count; i++) {\n        PERSISTENT_CHAR_ARRAY_SET(achievement_ids, achievement_id_charstrings, i, p_achievement_ids[i]);\n    }\n\n    EOS_Achievements_UnlockAchievementsOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ACHIEVEMENTS_UNLOCKACHIEVEMENTS_API_LATEST;\n    options.UserId = eosg_string_to_product_user_id(user_id.get_data());\n    options.AchievementIds = achievement_ids;\n    options.AchievementsCount = achievement_ids_count;\n    p_options->reference();\n\n    EOS_Achievements_UnlockAchievements(s_achievementsInterface, &options, (void *)*p_options, [](const EOS_Achievements_OnUnlockAchievementsCompleteCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"user_id\"] = eosg_product_user_id_to_string(data->UserId);\n        ret[\"achievements_count\"] = static_cast<int>(data->AchievementsCount);\n        IEOS::get_singleton()->emit_signal(\"achievements_interface_unlock_achievements_callback\", ret);\n    });\n}"
  },
  {
    "path": "src/anticheat_client_interface.cpp",
    "content": "#include \"ieos.h\"\nusing namespace godot;\n\nint IEOS::anticheat_client_interface_begin_session(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_antiCheatClientInterface, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    CharString p_local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    int p_mode = p_options->get(\"mode\");\n\n    EOS_AntiCheatClient_BeginSessionOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ANTICHEATCLIENT_BEGINSESSION_API_LATEST;\n    options.Mode = static_cast<EOS_EAntiCheatClientMode>(p_mode);\n    options.LocalUserId = eosg_string_to_product_user_id(p_local_user_id);\n\n    return static_cast<int>(EOS_AntiCheatClient_BeginSession(s_antiCheatClientInterface, &options));\n};\n\nint IEOS::anticheat_client_interface_end_session(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_antiCheatClientInterface, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    EOS_AntiCheatClient_EndSessionOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ANTICHEATCLIENT_ENDSESSION_API_LATEST;\n\n    return static_cast<int>(EOS_AntiCheatClient_EndSession(s_antiCheatClientInterface, &options));\n}\n\nint IEOS::anticheat_client_interface_add_external_integrity_catalog(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_antiCheatClientInterface, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    CharString p_path_to_bin_file = VARIANT_TO_CHARSTRING(p_options->get(\"path_to_bin_file\"));\n    EOS_AntiCheatClient_AddExternalIntegrityCatalogOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ANTICHEATCLIENT_ADDEXTERNALINTEGRITYCATALOG_API_LATEST;\n    options.PathToBinFile = ProjectSettings::get_singleton()->globalize_path(p_path_to_bin_file.get_data()).utf8();\n\n    return static_cast<int>(EOS_AntiCheatClient_AddExternalIntegrityCatalog(s_antiCheatClientInterface, &options));\n}\n\nint IEOS::anticheat_client_interface_receive_message_from_server(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_antiCheatClientInterface, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    PackedByteArray p_data = p_options->get(\"data\");\n\n    EOS_AntiCheatClient_ReceiveMessageFromServerOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ANTICHEATCLIENT_RECEIVEMESSAGEFROMSERVER_API_LATEST;\n    options.DataLengthBytes = static_cast<uint32_t>(p_data.size());\n    options.Data = p_data.ptr();\n\n    return static_cast<int>(EOS_AntiCheatClient_ReceiveMessageFromServer(s_antiCheatClientInterface, &options));\n}\n\nDictionary IEOS::anticheat_client_interface_get_protect_message_output_length(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_antiCheatClientInterface, {});\n    int p_data_length_bytes = p_options->get(\"data_length_bytes\");\n\n    EOS_AntiCheatClient_GetProtectMessageOutputLengthOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ANTICHEATCLIENT_GETPROTECTMESSAGEOUTPUTLENGTH_API_LATEST;\n    options.DataLengthBytes = static_cast<uint32_t>(p_data_length_bytes);\n\n    uint32_t outBufferSizeBytes = 0;\n\n    EOS_EResult res = EOS_AntiCheatClient_GetProtectMessageOutputLength(s_antiCheatClientInterface, &options, &outBufferSizeBytes);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"buffer_size_bytes\"] = 0;\n    if (res == EOS_EResult::EOS_Success) {\n        ret[\"buffer_size_bytes\"] = outBufferSizeBytes;\n    }\n\n    return ret;\n}\n\nDictionary IEOS::anticheat_client_interface_protect_message(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_antiCheatClientInterface, {});\n    PackedByteArray p_data = p_options->get(\"data\");\n    int data_length_bytes = p_data.size();\n    int out_buffer_size_bytes = p_options->get(\"out_buffer_size_bytes\");\n\n    EOS_AntiCheatClient_ProtectMessageOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ANTICHEATCLIENT_PROTECTMESSAGE_API_LATEST;\n    options.DataLengthBytes = static_cast<uint32_t>(data_length_bytes);\n    options.Data = p_data.ptr();\n    options.OutBufferSizeBytes = static_cast<uint32_t>(out_buffer_size_bytes);\n\n    uint32_t outBytesWritten = 0;\n    void *outBuffer = memalloc(out_buffer_size_bytes);\n\n    EOS_EResult res = EOS_AntiCheatClient_ProtectMessage(s_antiCheatClientInterface, &options, outBuffer, &outBytesWritten);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"out_buffer\"] = Variant();\n    ret[\"out_bytes_written\"] = 0;\n    if (res == EOS_EResult::EOS_Success) {\n        PackedByteArray buffer;\n        buffer.resize(outBytesWritten);\n        memcpy(buffer.ptrw(), outBuffer, outBytesWritten);\n        ret[\"out_buffer\"] = buffer;\n        ret[\"out_bytes_written\"] = outBytesWritten;\n    }\n    memfree(outBuffer);\n    return ret;\n}\n\nDictionary IEOS::anticheat_client_interface_unprotect_message(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_antiCheatClientInterface, {});\n    PackedByteArray p_data = p_options->get(\"data\");\n    int data_length_bytes = p_data.size();\n    int out_buffer_size_bytes = p_options->get(\"out_buffer_size_bytes\");\n\n    EOS_AntiCheatClient_UnprotectMessageOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ANTICHEATCLIENT_UNPROTECTMESSAGE_API_LATEST;\n    options.DataLengthBytes = static_cast<uint32_t>(data_length_bytes);\n    options.Data = p_data.ptr();\n    options.OutBufferSizeBytes = static_cast<uint32_t>(out_buffer_size_bytes);\n\n    uint32_t outBytesWritten = 0;\n    void *outBuffer = memalloc(out_buffer_size_bytes);\n\n    EOS_EResult res = EOS_AntiCheatClient_UnprotectMessage(s_antiCheatClientInterface, &options, outBuffer, &outBytesWritten);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"out_buffer\"] = Variant();\n    ret[\"out_bytes_written\"] = 0;\n    if (res == EOS_EResult::EOS_Success) {\n        PackedByteArray buffer;\n        buffer.resize(outBytesWritten);\n        memcpy(buffer.ptrw(), outBuffer, outBytesWritten);\n        ret[\"out_buffer\"] = buffer;\n        ret[\"out_bytes_written\"] = outBytesWritten;\n    }\n    memfree(outBuffer);\n    return ret;\n}\n\nint IEOS::anticheat_client_interface_register_peer(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_antiCheatClientInterface, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    CharString p_peer_handle = VARIANT_TO_CHARSTRING(p_options->get(\"peer_handle\"));\n    int p_client_type = p_options->get(\"client_type\");\n    int p_client_platform = p_options->get(\"client_platform\");\n    int p_authentication_timeout = p_options->get(\"authentication_timeout\");\n    CharString p_ip_address = VARIANT_TO_CHARSTRING(p_options->get(\"ip_address\"));\n    CharString p_peer_product_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"peer_product_user_id\"));\n\n    EOS_AntiCheatClient_RegisterPeerOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ANTICHEATCLIENT_REGISTERPEER_API_LATEST;\n    options.PeerHandle = _anticheat_player_id_to_handle(p_peer_handle);\n    options.ClientType = static_cast<EOS_EAntiCheatCommonClientType>(p_client_type);\n    options.ClientPlatform = static_cast<EOS_EAntiCheatCommonClientPlatform>(p_client_platform);\n    options.AuthenticationTimeout = static_cast<uint32_t>(p_authentication_timeout);\n    if (p_ip_address.size() > 1) {\n        options.IpAddress = p_ip_address.get_data();\n    }\n    options.PeerProductUserId = eosg_string_to_product_user_id(p_peer_product_user_id);\n\n    return static_cast<int>(EOS_AntiCheatClient_RegisterPeer(s_antiCheatClientInterface, &options));\n}\n\nint IEOS::anticheat_client_interface_unregister_peer(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_antiCheatClientInterface, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    CharString p_peer_handle = VARIANT_TO_CHARSTRING(p_options->get(\"peer_handle\"));\n\n    EOS_AntiCheatClient_UnregisterPeerOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ANTICHEATCLIENT_UNREGISTERPEER_API_LATEST;\n    options.PeerHandle = _anticheat_player_id_to_handle(p_peer_handle);\n\n    return static_cast<int>(EOS_AntiCheatClient_UnregisterPeer(s_antiCheatClientInterface, &options));\n}\n\nint IEOS::anticheat_client_interface_receive_message_from_peer(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_antiCheatClientInterface, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    CharString p_peer_handle = VARIANT_TO_CHARSTRING(p_options->get(\"peer_handle\"));\n    PackedByteArray p_data = p_options->get(\"data\");\n\n    EOS_AntiCheatClient_ReceiveMessageFromPeerOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ANTICHEATCLIENT_RECEIVEMESSAGEFROMPEER_API_LATEST;\n    options.DataLengthBytes = static_cast<uint32_t>(p_data.size());\n    options.Data = p_data.ptr();\n    options.PeerHandle = _anticheat_player_id_to_handle(p_peer_handle);\n\n    return static_cast<int>(EOS_AntiCheatClient_ReceiveMessageFromPeer(s_antiCheatClientInterface, &options));\n}\n"
  },
  {
    "path": "src/anticheat_server_interface.cpp",
    "content": "#include \"ieos.h\"\nusing namespace godot;\n\nint IEOS::anticheat_server_interface_begin_session(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_antiCheatServerInterface, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    int p_register_timeout_seconds = p_options->get(\"register_timeout_seconds\");\n    CharString p_server_name = VARIANT_TO_CHARSTRING(p_options->get(\"server_name\"));\n    CharString p_local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n\n    EOS_AntiCheatServer_BeginSessionOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ANTICHEATSERVER_BEGINSESSION_API_LATEST;\n    options.RegisterTimeoutSeconds = static_cast<uint32_t>(p_register_timeout_seconds);\n    options.ServerName = p_server_name.get_data();\n    options.bEnableGameplayData = VARIANT_TO_EOS_BOOL(p_options->get(\"enable_gameplay_data\"));\n    if (p_local_user_id.size() > 1) {\n        options.LocalUserId = eosg_string_to_product_user_id(p_local_user_id);\n    }\n\n    return static_cast<int>(EOS_AntiCheatServer_BeginSession(s_antiCheatServerInterface, &options));\n}\n\nint IEOS::anticheat_server_interface_end_session(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL_V(s_antiCheatServerInterface, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    EOS_AntiCheatServer_EndSessionOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ANTICHEATSERVER_ENDSESSION_API_LATEST;\n\n    return static_cast<int>(EOS_AntiCheatServer_EndSession(s_antiCheatServerInterface, &options));\n}\n\nint IEOS::anticheat_server_interface_register_client(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL_V(s_antiCheatServerInterface, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    CharString p_client_handle = VARIANT_TO_CHARSTRING(p_options->get(\"client_handle\"));\n    int p_client_type = p_options->get(\"client_type\");\n    int p_client_platform = p_options->get(\"client_platform\");\n    CharString p_ip_address = VARIANT_TO_CHARSTRING(p_options->get(\"ip_address\"));\n    CharString p_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"user_id\"));\n\n    EOS_AntiCheatServer_RegisterClientOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ANTICHEATSERVER_REGISTERCLIENT_API_LATEST;\n    options.ClientHandle = _anticheat_player_id_to_handle(p_client_handle);\n    options.ClientType = static_cast<EOS_EAntiCheatCommonClientType>(p_client_type);\n    options.ClientPlatform = static_cast<EOS_EAntiCheatCommonClientPlatform>(p_client_platform);\n    options.IpAddress = p_ip_address.get_data();\n    options.UserId = eosg_string_to_product_user_id(p_user_id);\n\n    return static_cast<int>(EOS_AntiCheatServer_RegisterClient(s_antiCheatServerInterface, &options));\n}\n\nint IEOS::anticheat_server_interface_unregister_client(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL_V(s_antiCheatServerInterface, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    CharString p_client_handle = VARIANT_TO_CHARSTRING(p_options->get(\"client_handle\"));\n\n    EOS_AntiCheatServer_UnregisterClientOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ANTICHEATSERVER_UNREGISTERCLIENT_API_LATEST;\n    options.ClientHandle = _anticheat_player_id_to_handle(p_client_handle);\n\n    return static_cast<int>(EOS_AntiCheatServer_UnregisterClient(s_antiCheatServerInterface, &options));\n}\n\nint IEOS::anticheat_server_interface_receive_message_from_client(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL_V(s_antiCheatServerInterface, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    CharString p_client_handle = VARIANT_TO_CHARSTRING(p_options->get(\"client_handle\"));\n    PackedByteArray p_data = p_options->get(\"data\");\n\n    void *data = memalloc(p_data.size());\n    std::memcpy(data, p_data.ptr(), p_data.size());\n\n    EOS_AntiCheatServer_ReceiveMessageFromClientOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ANTICHEATSERVER_RECEIVEMESSAGEFROMCLIENT_API_LATEST;\n    options.ClientHandle = _anticheat_player_id_to_handle(p_client_handle);\n    options.DataLengthBytes = static_cast<uint32_t>(p_data.size());\n    options.Data = data;\n\n    return static_cast<int>(EOS_AntiCheatServer_ReceiveMessageFromClient(s_antiCheatServerInterface, &options));\n}\n\nint IEOS::anticheat_server_interface_set_client_details(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL_V(s_antiCheatServerInterface, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    CharString p_client_handle = VARIANT_TO_CHARSTRING(p_options->get(\"client_handle\"));\n    int p_client_flags = p_options->get(\"client_flags\");\n    int p_client_input = p_options->get(\"client_input\");\n\n    EOS_AntiCheatCommon_SetClientDetailsOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ANTICHEATCOMMON_SETCLIENTDETAILS_API_LATEST;\n    options.ClientHandle = _anticheat_player_id_to_handle(p_client_handle);\n    options.ClientFlags = static_cast<EOS_EAntiCheatCommonClientFlags>(p_client_flags);\n    options.ClientInputMethod = static_cast<EOS_EAntiCheatCommonClientInput>(p_client_input);\n\n    return static_cast<int>(EOS_AntiCheatServer_SetClientDetails(s_antiCheatServerInterface, &options));\n}\n\nint IEOS::anticheat_server_interface_set_game_session_id(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL_V(s_antiCheatServerInterface, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    CharString p_game_session_id = VARIANT_TO_CHARSTRING(p_options->get(\"game_session_id\"));\n\n    EOS_AntiCheatCommon_SetGameSessionIdOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ANTICHEATCOMMON_SETGAMESESSIONID_API_LATEST;\n    options.GameSessionId = p_game_session_id.get_data();\n\n    return static_cast<int>(EOS_AntiCheatServer_SetGameSessionId(s_antiCheatServerInterface, &options));\n}\n\nint IEOS::anticheat_server_interface_set_client_network_state(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL_V(s_antiCheatServerInterface, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    CharString p_client_handle = VARIANT_TO_CHARSTRING(p_options->get(\"client_handle\"));\n\n    EOS_AntiCheatServer_SetClientNetworkStateOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ANTICHEATSERVER_SETCLIENTNETWORKSTATE_API_LATEST;\n    options.ClientHandle = _anticheat_player_id_to_handle(p_client_handle);\n    options.bIsNetworkActive = VARIANT_TO_EOS_BOOL(p_options->get(\"is_network_active\"));\n\n    return static_cast<int>(EOS_AntiCheatServer_SetClientNetworkState(s_antiCheatServerInterface, &options));\n}\n\nDictionary IEOS::anticheat_server_interface_get_protect_message_output_length(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL_V(s_antiCheatServerInterface, {});\n    int p_data_length_bytes = p_options->get(\"data_length_bytes\");\n\n    EOS_AntiCheatServer_GetProtectMessageOutputLengthOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ANTICHEATSERVER_GETPROTECTMESSAGEOUTPUTLENGTH_API_LATEST;\n    options.DataLengthBytes = static_cast<uint32_t>(p_data_length_bytes);\n\n    uint32_t outBufferSizeBytes = 0;\n\n    EOS_EResult res = EOS_AntiCheatServer_GetProtectMessageOutputLength(s_antiCheatServerInterface, &options, &outBufferSizeBytes);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"buffer_size_bytes\"] = 0;\n    if (res == EOS_EResult::EOS_Success) {\n        ret[\"buffer_size_bytes\"] = outBufferSizeBytes;\n    }\n\n    return ret;\n}\n\nDictionary IEOS::anticheat_server_interface_protect_message(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL_V(s_antiCheatServerInterface, {});\n    CharString p_client_handle = VARIANT_TO_CHARSTRING(p_options->get(\"client_handle\"));\n    PackedByteArray p_data = p_options->get(\"data\");\n    int data_length_bytes = p_data.size();\n    void *data = memalloc(data_length_bytes);\n    std::memcpy(data, p_data.ptr(), data_length_bytes);\n    int out_buffer_size_bytes = p_options->get(\"out_buffer_size_bytes\");\n\n    EOS_AntiCheatServer_ProtectMessageOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ANTICHEATSERVER_PROTECTMESSAGE_API_LATEST;\n    options.ClientHandle = _anticheat_player_id_to_handle(p_client_handle);\n    options.DataLengthBytes = static_cast<uint32_t>(data_length_bytes);\n    options.Data = data;\n    options.OutBufferSizeBytes = static_cast<uint32_t>(out_buffer_size_bytes);\n\n    uint32_t outBytesWritten = 0;\n    void *outBuffer = (void *)memalloc(out_buffer_size_bytes + 1);\n\n    EOS_EResult res = EOS_AntiCheatServer_ProtectMessage(s_antiCheatServerInterface, &options, &outBuffer, &outBytesWritten);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"out_buffer\"] = Variant();\n    ret[\"out_bytes_written\"] = 0;\n    if (res == EOS_EResult::EOS_Success) {\n        ret[\"out_buffer\"] = outBuffer;\n        ret[\"out_bytes_written\"] = outBytesWritten;\n    }\n    return ret;\n}\n\nDictionary IEOS::anticheat_server_interface_unprotect_message(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL_V(s_antiCheatServerInterface, {});\n    CharString p_client_handle = VARIANT_TO_CHARSTRING(p_options->get(\"client_handle\"));\n    PackedByteArray p_data = p_options->get(\"data\");\n    int data_length_bytes = p_data.size();\n    void *data = memalloc(data_length_bytes);\n    std::memcpy(data, p_data.ptr(), data_length_bytes);\n\n    int out_buffer_size_bytes = p_options->get(\"out_buffer_size_bytes\");\n\n    EOS_AntiCheatServer_UnprotectMessageOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ANTICHEATSERVER_UNPROTECTMESSAGE_API_LATEST;\n    options.ClientHandle = _anticheat_player_id_to_handle(p_client_handle);\n    options.DataLengthBytes = static_cast<uint32_t>(data_length_bytes);\n    options.Data = data;\n    options.OutBufferSizeBytes = static_cast<uint32_t>(out_buffer_size_bytes);\n\n    uint32_t outBytesWritten = 0;\n    void *outBuffer = (void *)memalloc(out_buffer_size_bytes + 1);\n\n    EOS_EResult res = EOS_AntiCheatServer_UnprotectMessage(s_antiCheatServerInterface, &options, &outBuffer, &outBytesWritten);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"out_buffer\"] = Variant();\n    ret[\"out_bytes_written\"] = 0;\n    if (res == EOS_EResult::EOS_Success) {\n        ret[\"out_buffer\"] = outBuffer;\n        ret[\"out_bytes_written\"] = outBytesWritten;\n    }\n    return ret;\n}\n\nint IEOS::anticheat_server_interface_register_event(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL_V(s_antiCheatServerInterface, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    int p_event_id = p_options->get(\"event_id\");\n    CharString p_event_name = VARIANT_TO_CHARSTRING(p_options->get(\"event_name\"));\n    int p_event_type = p_options->get(\"event_type\");\n    Array p_param_defs = p_options->get(\"param_defs\");\n\n    PERSISTENT_CHAR_ARRAY_CREATE(param_names, param_names_charstrings, p_param_defs.size());\n    EOS_AntiCheatCommon_RegisterEventParamDef *paramDefs = (EOS_AntiCheatCommon_RegisterEventParamDef *)memalloc(sizeof(EOS_AntiCheatCommon_RegisterEventParamDef) * p_param_defs.size());\n    for (int i = 0; i < p_param_defs.size(); i++) {\n        Dictionary paramDef = p_param_defs[i];\n        int param_type = paramDef[\"param_type\"];\n        PERSISTENT_CHAR_ARRAY_SET(param_names, param_names_charstrings, i, paramDef[\"param_name\"]);\n        paramDefs[i].ParamType = static_cast<EOS_EAntiCheatCommonEventParamType>(param_type);\n        paramDefs[i].ParamName = param_names[i];\n    }\n\n    EOS_AntiCheatCommon_RegisterEventOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ANTICHEATCOMMON_REGISTEREVENT_API_LATEST;\n    options.EventId = static_cast<uint32_t>(p_event_id);\n    options.EventName = p_event_name.get_data();\n    options.EventType = static_cast<EOS_EAntiCheatCommonEventType>(p_event_type);\n    options.ParamDefsCount = p_param_defs.size();\n    options.ParamDefs = paramDefs;\n\n    return static_cast<int>(EOS_AntiCheatServer_RegisterEvent(s_antiCheatServerInterface, &options));\n}\n\nint IEOS::anticheat_server_interface_log_event(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL_V(s_antiCheatServerInterface, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    CharString p_client_handle = VARIANT_TO_CHARSTRING(p_options->get(\"client_handle\"));\n    int p_event_id = p_options->get(\"event_id\");\n    Array p_params = p_options->get(\"params\");\n\n    int params_count = p_params.size();\n    EOS_AntiCheatCommon_LogEventParamPair *params = (EOS_AntiCheatCommon_LogEventParamPair *)memalloc(sizeof(EOS_AntiCheatCommon_LogEventParamPair) * params_count);\n    for (int i = 0; i < params_count; i++) {\n        Variant param = p_params[i];\n\n        if (param.get_type() == Variant::INT) {\n            params[i].ParamValueType = EOS_EAntiCheatCommonEventParamType::EOS_ACCEPT_Int64;\n            params[i].ParamValue.Int64 = param;\n        } else if (param.get_type() == Variant::STRING) {\n            params[i].ParamValueType = EOS_EAntiCheatCommonEventParamType::EOS_ACCEPT_String;\n            params[i].ParamValue.String = VARIANT_TO_CHARSTRING(param).get_data();\n            break;\n        } else if (param.get_type() == Variant::VECTOR3) {\n            params[i].ParamValueType = EOS_EAntiCheatCommonEventParamType::EOS_ACCEPT_Vector3f;\n            Vector3 vec = param;\n            params[i].ParamValue.Vec3f.x = vec.x;\n            params[i].ParamValue.Vec3f.y = vec.y;\n            params[i].ParamValue.Vec3f.z = vec.z;\n            break;\n        } else if (param.get_type() == Variant::FLOAT) {\n            params[i].ParamValueType = EOS_EAntiCheatCommonEventParamType::EOS_ACCEPT_Float;\n            params[i].ParamValue.Float = param;\n            break;\n        } else if (param.get_type() == Variant::QUATERNION) {\n            Quaternion quat = param;\n            params[i].ParamValueType = EOS_EAntiCheatCommonEventParamType::EOS_ACCEPT_Quat;\n            params[i].ParamValue.Quat.x = quat.x;\n            params[i].ParamValue.Quat.y = quat.y;\n            params[i].ParamValue.Quat.z = quat.z;\n            params[i].ParamValue.Quat.w = quat.w;\n            break;\n        } else {\n            ERR_FAIL_V_MSG(static_cast<int>(EOS_EResult::EOS_InvalidParameters), \"Invalid param type provided.\");\n        }\n    }\n\n    EOS_AntiCheatCommon_LogEventOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ANTICHEATCOMMON_LOGEVENT_API_LATEST;\n    options.ClientHandle = _anticheat_player_id_to_handle(p_client_handle);\n    options.EventId = static_cast<uint32_t>(p_event_id);\n    options.ParamsCount = params_count;\n    options.Params = params;\n\n    return static_cast<int>(EOS_AntiCheatServer_LogEvent(s_antiCheatServerInterface, &options));\n}\n\nint IEOS::anticheat_server_interface_log_game_round_start(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL_V(s_antiCheatServerInterface, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    CharString p_session_identifier = VARIANT_TO_CHARSTRING(p_options->get(\"session_identifier\"));\n    CharString p_level_name = VARIANT_TO_CHARSTRING(p_options->get(\"level_name\"));\n    CharString p_mode_name = VARIANT_TO_CHARSTRING(p_options->get(\"mode_name\"));\n    int p_round_time_seconds = p_options->get(\"round_time_seconds\");\n    int p_competition_type = p_options->get(\"competition_type\");\n\n    EOS_AntiCheatCommon_LogGameRoundStartOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ANTICHEATCOMMON_LOGGAMEROUNDSTART_API_LATEST;\n    if (p_session_identifier.size() > 1) {\n        options.SessionIdentifier = p_session_identifier.get_data();\n    }\n    if (p_level_name.size() > 1) {\n        options.LevelName = p_level_name.get_data();\n    }\n    if (p_mode_name.size() > 1) {\n        options.ModeName = p_mode_name.get_data();\n    }\n    options.RoundTimeSeconds = static_cast<uint32_t>(p_round_time_seconds);\n    options.CompetitionType = static_cast<EOS_EAntiCheatCommonGameRoundCompetitionType>(p_competition_type);\n\n    return static_cast<int>(EOS_AntiCheatServer_LogGameRoundStart(s_antiCheatServerInterface, &options));\n}\n\nint IEOS::anticheat_server_interface_log_game_round_end(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL_V(s_antiCheatServerInterface, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    int p_winning_team_id = p_options->get(\"winning_team_id\");\n\n    EOS_AntiCheatCommon_LogGameRoundEndOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ANTICHEATCOMMON_LOGGAMEROUNDEND_API_LATEST;\n    options.WinningTeamId = static_cast<uint32_t>(p_winning_team_id);\n\n    return static_cast<int>(EOS_AntiCheatServer_LogGameRoundEnd(s_antiCheatServerInterface, &options));\n}\n\nint IEOS::anticheat_server_interface_log_player_spawn(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL_V(s_antiCheatServerInterface, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    CharString p_spawned_player_handle = VARIANT_TO_CHARSTRING(p_options->get(\"spawned_player_handle\"));\n    int p_team_id = p_options->get(\"team_id\");\n    int p_character_id = p_options->get(\"character_id\");\n\n    EOS_AntiCheatCommon_LogPlayerSpawnOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ANTICHEATCOMMON_LOGPLAYERSPAWN_API_LATEST;\n    options.SpawnedPlayerHandle = _anticheat_player_id_to_handle(p_spawned_player_handle);\n    options.TeamId = static_cast<uint32_t>(p_team_id);\n    options.CharacterId = static_cast<uint32_t>(p_character_id);\n\n    return static_cast<int>(EOS_AntiCheatServer_LogPlayerSpawn(s_antiCheatServerInterface, &options));\n}\n\nint IEOS::anticheat_server_interface_log_player_despawn(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL_V(s_antiCheatServerInterface, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    CharString p_despawned_player_handle = VARIANT_TO_CHARSTRING(p_options->get(\"despawned_player_handle\"));\n\n    EOS_AntiCheatCommon_LogPlayerDespawnOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ANTICHEATCOMMON_LOGPLAYERDESPAWN_API_LATEST;\n    options.DespawnedPlayerHandle = _anticheat_player_id_to_handle(p_despawned_player_handle);\n\n    return static_cast<int>(EOS_AntiCheatServer_LogPlayerDespawn(s_antiCheatServerInterface, &options));\n}\n\nint IEOS::anticheat_server_interface_log_player_revive(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL_V(s_antiCheatServerInterface, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    CharString p_revived_player_handle = VARIANT_TO_CHARSTRING(p_options->get(\"revived_player_handle\"));\n    CharString p_reviver_player_handle = VARIANT_TO_CHARSTRING(p_options->get(\"reviver_player_handle\"));\n\n    EOS_AntiCheatCommon_LogPlayerReviveOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ANTICHEATCOMMON_LOGPLAYERREVIVE_API_LATEST;\n    options.RevivedPlayerHandle = _anticheat_player_id_to_handle(p_revived_player_handle);\n    options.ReviverPlayerHandle = _anticheat_player_id_to_handle(p_reviver_player_handle);\n\n    return static_cast<int>(EOS_AntiCheatServer_LogPlayerRevive(s_antiCheatServerInterface, &options));\n}\n\nint IEOS::anticheat_server_interface_log_player_tick(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL_V(s_antiCheatServerInterface, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    CharString p_player_handle = VARIANT_TO_CHARSTRING(p_options->get(\"player_handle\"));\n    Vector3 p_player_position = p_options->get(\"player_position\");\n    Quaternion p_player_view_rotation = p_options->get(\"player_view_rotation\");\n    float p_player_health = p_options->get(\"player_health\");\n    int p_player_movement_state = p_options->get(\"player_movement_state\");\n    Vector3 p_player_view_position = p_options->get(\"player_view_position\");\n\n    EOS_AntiCheatCommon_Vec3f player_position;\n    player_position.x = p_player_position.x;\n    player_position.y = p_player_position.y;\n    player_position.z = p_player_position.z;\n\n    EOS_AntiCheatCommon_Quat player_view_rotation;\n    player_view_rotation.x = p_player_view_rotation.x;\n    player_view_rotation.y = p_player_view_rotation.y;\n    player_view_rotation.z = p_player_view_rotation.z;\n    player_view_rotation.w = p_player_view_rotation.w;\n\n    EOS_AntiCheatCommon_Vec3f player_view_position;\n    player_view_position.x = p_player_view_position.x;\n    player_view_position.y = p_player_view_position.y;\n    player_view_position.z = p_player_view_position.z;\n\n    EOS_AntiCheatCommon_LogPlayerTickOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ANTICHEATCOMMON_LOGPLAYERTICK_API_LATEST;\n    options.PlayerHandle = _anticheat_player_id_to_handle(p_player_handle);\n    options.PlayerPosition = &player_position;\n    options.PlayerViewRotation = &player_view_rotation;\n    options.bIsPlayerViewZoomed = VARIANT_TO_EOS_BOOL(p_options->get(\"is_player_view_zoomed\"));\n    options.PlayerHealth = p_player_health;\n    options.PlayerMovementState = static_cast<EOS_EAntiCheatCommonPlayerMovementState>(p_player_movement_state);\n    options.PlayerViewPosition = &player_view_position;\n\n    return static_cast<int>(EOS_AntiCheatServer_LogPlayerTick(s_antiCheatServerInterface, &options));\n}\n\nint IEOS::anticheat_server_interface_log_player_use_weapon(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL_V(s_antiCheatServerInterface, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    Variant p_player_handle = p_options->get(\"player_handle\");\n    Vector3 p_player_position = p_options->get(\"player_position\");\n    Quaternion p_player_view_rotation = p_options->get(\"player_view_rotation\");\n    CharString p_weapon_name = VARIANT_TO_CHARSTRING(p_options->get(\"weapon_name\"));\n\n    EOS_AntiCheatCommon_Vec3f player_position;\n    player_position.x = p_player_position.x;\n    player_position.y = p_player_position.y;\n    player_position.z = p_player_position.z;\n\n    EOS_AntiCheatCommon_Quat player_view_rotation;\n    player_view_rotation.x = p_player_view_rotation.x;\n    player_view_rotation.y = p_player_view_rotation.y;\n    player_view_rotation.z = p_player_view_rotation.z;\n    player_view_rotation.w = p_player_view_rotation.w;\n\n    EOS_AntiCheatCommon_LogPlayerUseWeaponData use_weapon_data;\n    memset(&use_weapon_data, 0, sizeof(use_weapon_data));\n    use_weapon_data.PlayerHandle = (void *)p_player_handle;\n    use_weapon_data.PlayerPosition = &player_position;\n    use_weapon_data.PlayerViewRotation = &player_view_rotation;\n    use_weapon_data.bIsPlayerViewZoomed = VARIANT_TO_EOS_BOOL(p_options->get(\"is_player_view_zoomed\"));\n    use_weapon_data.bIsMeleeAttack = VARIANT_TO_EOS_BOOL(p_options->get(\"is_melee_attack\"));\n    use_weapon_data.WeaponName = p_weapon_name.get_data();\n\n    EOS_AntiCheatCommon_LogPlayerUseWeaponOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ANTICHEATCOMMON_LOGPLAYERUSEWEAPON_API_LATEST;\n    options.UseWeaponData = &use_weapon_data;\n\n    return static_cast<int>(EOS_AntiCheatServer_LogPlayerUseWeapon(s_antiCheatServerInterface, &options));\n}\n\nint IEOS::anticheat_server_interface_log_player_use_ability(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL_V(s_antiCheatServerInterface, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    CharString p_player_handle = VARIANT_TO_CHARSTRING(p_options->get(\"player_handle\"));\n    int p_ability_id = p_options->get(\"ability_id\");\n    int p_ability_duration_ms = p_options->get(\"ability_duration_ms\");\n    int p_ability_cooldown_ms = p_options->get(\"ability_cooldown_ms\");\n\n    EOS_AntiCheatCommon_LogPlayerUseAbilityOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ANTICHEATCOMMON_LOGPLAYERUSEABILITY_API_LATEST;\n    options.PlayerHandle = _anticheat_player_id_to_handle(p_player_handle);\n    options.AbilityId = static_cast<uint32_t>(p_ability_id);\n    options.AbilityDurationMs = static_cast<uint32_t>(p_ability_duration_ms);\n    options.AbilityCooldownMs = static_cast<uint32_t>(p_ability_cooldown_ms);\n\n    return static_cast<int>(EOS_AntiCheatServer_LogPlayerUseAbility(s_antiCheatServerInterface, &options));\n}\n\nint IEOS::anticheat_server_interface_log_player_take_damage(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL_V(s_antiCheatServerInterface, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    CharString p_victim_player_handle = VARIANT_TO_CHARSTRING(p_options->get(\"victim_player_handle\"));\n    Vector3 p_victim_player_position = p_options->get(\"victim_player_position\");\n    Quaternion p_victim_player_view_rotation = p_options->get(\"victim_player_view_rotation\");\n\n    CharString p_attacker_player_handle = VARIANT_TO_CHARSTRING(p_options->get(\"attacker_player_handle\"));\n    Vector3 p_attacker_player_position = p_options->get(\"attacker_player_position\");\n    Quaternion p_attacker_player_view_rotation = p_options->get(\"attacker_player_view_rotation\");\n\n    float p_damage_taken = p_options->get(\"damage_taken\");\n    float p_health_remaining = p_options->get(\"health_remaining\");\n    int p_damage_source = p_options->get(\"damage_source\");\n    int p_damage_type = p_options->get(\"damage_type\");\n    int p_damage_result = p_options->get(\"damage_result\");\n    int p_time_since_player_use_weapon_ms = p_options->get(\"time_since_player_use_weapon_ms\");\n    Vector3 p_damage_position = p_options->get(\"damage_position\");\n    Vector3 p_attacker_player_view_position = p_options->get(\"attacker_player_view_position\");\n\n    Ref<RefCounted> use_weapon_data_options = p_options->get(\"player_use_weapon_data\");\n    Variant uw_player_handle = use_weapon_data_options->get(\"player_handle\");\n    Vector3 uw_player_position = use_weapon_data_options->get(\"player_position\");\n    Quaternion uw_player_view_rotation = use_weapon_data_options->get(\"player_view_rotation\");\n    CharString uw_weapon_name = VARIANT_TO_CHARSTRING(use_weapon_data_options->get(\"weapon_name\"));\n\n    EOS_AntiCheatCommon_Vec3f uw_v_player_position;\n    uw_v_player_position.x = uw_player_position.x;\n    uw_v_player_position.y = uw_player_position.y;\n    uw_v_player_position.z = uw_player_position.z;\n\n    EOS_AntiCheatCommon_Quat uw_q_player_view_rotation;\n    uw_q_player_view_rotation.x = uw_player_view_rotation.x;\n    uw_q_player_view_rotation.y = uw_player_view_rotation.y;\n    uw_q_player_view_rotation.z = uw_player_view_rotation.z;\n    uw_q_player_view_rotation.w = uw_player_view_rotation.w;\n\n    EOS_AntiCheatCommon_LogPlayerUseWeaponData use_weapon_data;\n    memset(&use_weapon_data, 0, sizeof(use_weapon_data));\n    use_weapon_data.PlayerHandle = (void *)uw_player_handle;\n    use_weapon_data.PlayerPosition = &uw_v_player_position;\n    use_weapon_data.PlayerViewRotation = &uw_q_player_view_rotation;\n    use_weapon_data.bIsPlayerViewZoomed = VARIANT_TO_EOS_BOOL(use_weapon_data_options->get(\"is_player_view_zoomed\"));\n    use_weapon_data.bIsMeleeAttack = VARIANT_TO_EOS_BOOL(use_weapon_data_options->get(\"is_melee_attack\"));\n    use_weapon_data.WeaponName = uw_weapon_name.get_data();\n\n    EOS_AntiCheatCommon_Vec3f victim_position;\n    victim_position.x = p_victim_player_position.x;\n    victim_position.y = p_victim_player_position.y;\n    victim_position.z = p_victim_player_position.z;\n\n    EOS_AntiCheatCommon_Quat victim_view_rotation;\n    victim_view_rotation.x = p_victim_player_view_rotation.x;\n    victim_view_rotation.y = p_victim_player_view_rotation.y;\n    victim_view_rotation.z = p_victim_player_view_rotation.z;\n    victim_view_rotation.w = p_victim_player_view_rotation.w;\n\n    EOS_AntiCheatCommon_Vec3f attacker_position;\n    attacker_position.x = p_attacker_player_position.x;\n    attacker_position.y = p_attacker_player_position.y;\n    attacker_position.z = p_attacker_player_position.z;\n\n    EOS_AntiCheatCommon_Quat attacker_view_rotation;\n    attacker_view_rotation.x = p_attacker_player_view_rotation.x;\n    attacker_view_rotation.y = p_attacker_player_view_rotation.y;\n    attacker_view_rotation.z = p_attacker_player_view_rotation.z;\n    attacker_view_rotation.w = p_attacker_player_view_rotation.w;\n\n    EOS_AntiCheatCommon_Vec3f damage_position_v;\n    damage_position_v.x = p_damage_position.x;\n    damage_position_v.y = p_damage_position.y;\n    damage_position_v.z = p_damage_position.z;\n\n    EOS_AntiCheatCommon_Vec3f attacker_view_position_v;\n    attacker_view_position_v.x = p_attacker_player_view_position.x;\n    attacker_view_position_v.y = p_attacker_player_view_position.y;\n    attacker_view_position_v.z = p_attacker_player_view_position.z;\n\n    EOS_AntiCheatCommon_LogPlayerTakeDamageOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ANTICHEATCOMMON_LOGPLAYERTAKEDAMAGE_API_LATEST;\n    options.VictimPlayerHandle = _anticheat_player_id_to_handle(p_victim_player_handle);\n    options.VictimPlayerPosition = &victim_position;\n    options.VictimPlayerViewRotation = &victim_view_rotation;\n    options.AttackerPlayerHandle = _anticheat_player_id_to_handle(p_attacker_player_handle);\n    options.AttackerPlayerPosition = &attacker_position;\n    options.AttackerPlayerViewRotation = &attacker_view_rotation;\n    options.bIsHitscanAttack = VARIANT_TO_EOS_BOOL(p_options->get(\"is_hitscan_attack\"));\n    options.bHasLineOfSight = VARIANT_TO_EOS_BOOL(p_options->get(\"has_line_of_sight\"));\n    options.bIsCriticalHit = VARIANT_TO_EOS_BOOL(p_options->get(\"is_critical_hit\"));\n    options.DamageTaken = p_damage_taken;\n    options.HealthRemaining = p_health_remaining;\n    options.DamageSource = static_cast<EOS_EAntiCheatCommonPlayerTakeDamageSource>(p_damage_source);\n    options.DamageType = static_cast<EOS_EAntiCheatCommonPlayerTakeDamageType>(p_damage_type);\n    options.DamageResult = static_cast<EOS_EAntiCheatCommonPlayerTakeDamageResult>(p_damage_result);\n    options.PlayerUseWeaponData = &use_weapon_data;\n    options.TimeSincePlayerUseWeaponMs = static_cast<uint32_t>(p_time_since_player_use_weapon_ms);\n    options.DamagePosition = &damage_position_v;\n    options.AttackerPlayerViewPosition = &attacker_view_position_v;\n\n    return static_cast<int>(EOS_AntiCheatServer_LogPlayerTakeDamage(s_antiCheatServerInterface, &options));\n}\n"
  },
  {
    "path": "src/auth_interface.cpp",
    "content": "#include \"ieos.h\"\nusing namespace godot;\n\nvoid IEOS::auth_interface_login(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_authInterface);\n    Ref<RefCounted> p_credentials = p_options->get(\"credentials\");\n\n    EOS_Auth_Credentials credentials;\n    memset(&credentials, 0, sizeof(credentials));\n    credentials.ApiVersion = EOS_AUTH_CREDENTIALS_API_LATEST;\n    credentials.Type = static_cast<EOS_ELoginCredentialType>((int)p_credentials->get(\"type\"));\n    CharString id = VARIANT_TO_CHARSTRING(p_credentials->get(\"id\"));\n    if (id.length() > 0) {\n        credentials.Id = id.get_data();\n    }\n    CharString token = VARIANT_TO_CHARSTRING(p_credentials->get(\"token\"));\n    if (token.length() > 0) {\n        credentials.Token = token.get_data();\n    }\n    int p_external_type = p_credentials->get(\"external_type\");\n    if (p_external_type != -1) {\n        credentials.ExternalType = static_cast<EOS_EExternalCredentialType>(p_external_type);\n    }\n\n    EOS_Auth_LoginOptions loginOptions;\n    memset(&loginOptions, 0, sizeof(loginOptions));\n    loginOptions.ApiVersion = EOS_AUTH_LOGIN_API_LATEST;\n    loginOptions.Credentials = &credentials;\n    loginOptions.ScopeFlags = static_cast<EOS_EAuthScopeFlags>(static_cast<int>(p_options->get(\"scope_flags\")));\n    loginOptions.LoginFlags = static_cast<uint64_t>(p_options->get(\"login_flags\"));\n    p_options->reference();\n\n    EOS_Auth_Login(s_authInterface, &loginOptions, (void *)*p_options, [](const EOS_Auth_LoginCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"local_user_id\"] = eosg_epic_account_id_to_string(data->LocalUserId);\n        ret[\"pin_grant_info\"] = eosg_auth_pin_grant_info_to_dict(data->PinGrantInfo);\n        ret[\"continuance_token\"] = eosg_continuance_token_to_wrapper(data->ContinuanceToken);\n        ret[\"selected_account_id\"] = eosg_epic_account_id_to_string(data->SelectedAccountId);\n\n        if (data->ResultCode == EOS_EResult::EOS_Success) {\n            ret[\"pending\"] = false;\n            ret[\"success\"] = true;\n        } else if (EOS_EResult_IsOperationComplete(data->ResultCode)) {\n            ret[\"pending\"] = false;\n            ret[\"success\"] = false;\n        } else {\n            ret[\"pending\"] = true;\n            ret[\"success\"] = false;\n        }\n        IEOS::get_singleton()->emit_signal(\"auth_interface_login_callback\", ret);\n    });\n}\n\nvoid IEOS::auth_interface_logout(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_authInterface);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n\n    EOS_Auth_LogoutOptions logoutOptions;\n    memset(&logoutOptions, 0, sizeof(logoutOptions));\n    logoutOptions.ApiVersion = EOS_AUTH_LOGOUT_API_LATEST;\n    logoutOptions.LocalUserId = eosg_string_to_epic_account_id(local_user_id.get_data());\n    p_options->reference();\n\n    EOS_Auth_Logout(s_authInterface, &logoutOptions, (void *)*p_options, [](const EOS_Auth_LogoutCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"local_user_id\"] = eosg_epic_account_id_to_string(data->LocalUserId);\n        IEOS::get_singleton()->emit_signal(\"auth_interface_logout_callback\", ret);\n    });\n}\n\nDictionary IEOS::auth_interface_copy_id_token(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_authInterface, {});\n    CharString account_id = VARIANT_TO_CHARSTRING(p_options->get(\"account_id\"));\n\n    EOS_Auth_CopyIdTokenOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_AUTH_COPYIDTOKEN_API_LATEST;\n    options.AccountId = eosg_string_to_epic_account_id(account_id.get_data());\n\n    EOS_Auth_IdToken *outToken = nullptr;\n    EOS_EResult res = EOS_Auth_CopyIdToken(s_authInterface, &options, &outToken);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"id_token\"] = eosg_auth_id_token_to_dict_and_release(outToken);\n    return ret;\n}\n\nDictionary IEOS::auth_interface_copy_user_auth_token(Ref<RefCounted> p_options, const String &p_local_user_id) {\n    ERR_FAIL_NULL_V(s_authInterface, {});\n    CharString local_user_id = p_local_user_id.utf8();\n\n    EOS_Auth_CopyUserAuthTokenOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_AUTH_COPYUSERAUTHTOKEN_API_LATEST;\n\n    EOS_Auth_Token *outToken = nullptr;\n    EOS_EpicAccountId localUserId = eosg_string_to_epic_account_id(local_user_id.get_data());\n    EOS_EResult res = EOS_Auth_CopyUserAuthToken(s_authInterface, &options, localUserId, &outToken);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"token\"] = eosg_auth_token_to_dict_and_release(outToken);\n    return ret;\n}\n\nvoid IEOS::auth_interface_delete_persistent_auth(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_authInterface);\n    CharString refresh_token = VARIANT_TO_CHARSTRING(p_options->get(\"refresh_token\"));\n\n    EOS_Auth_DeletePersistentAuthOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_AUTH_DELETEPERSISTENTAUTH_API_LATEST;\n    options.RefreshToken = nullptr;\n\n    if (refresh_token.size() != 0) {\n        options.RefreshToken = refresh_token.get_data();\n    }\n    p_options->reference();\n\n    EOS_Auth_DeletePersistentAuth(s_authInterface, &options, (void *)*p_options, [](const EOS_Auth_DeletePersistentAuthCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        IEOS::get_singleton()->emit_signal(\"auth_interface_delete_persistent_auth_callback\", ret);\n    });\n}\n\nString IEOS::auth_interface_get_logged_in_account_by_index(int index) {\n    ERR_FAIL_NULL_V(s_authInterface, \"\");\n    EOS_EpicAccountId accountId = EOS_Auth_GetLoggedInAccountByIndex(s_authInterface, index);\n    return eosg_epic_account_id_to_string(accountId);\n}\n\nint IEOS::auth_interface_get_logged_in_accounts_count() {\n    ERR_FAIL_NULL_V(s_authInterface, 0);\n    return static_cast<int>(EOS_Auth_GetLoggedInAccountsCount(s_authInterface));\n}\n\nint IEOS::auth_interface_get_login_status(const String &p_local_user_id) {\n    ERR_FAIL_NULL_V(s_authInterface, static_cast<int>(EOS_ELoginStatus::EOS_LS_NotLoggedIn));\n    CharString local_user_id = p_local_user_id.utf8();\n    EOS_EpicAccountId accountId = eosg_string_to_epic_account_id(local_user_id.get_data());\n    return static_cast<int>(EOS_Auth_GetLoginStatus(s_authInterface, accountId));\n}\n\nString IEOS::auth_interface_get_merged_account_by_index(const String &p_local_user_id, int index) {\n    ERR_FAIL_NULL_V(s_authInterface, \"\");\n    CharString local_user_id = p_local_user_id.utf8();\n    EOS_EpicAccountId localUserId = eosg_string_to_epic_account_id(local_user_id.get_data());\n    EOS_EpicAccountId accountId = EOS_Auth_GetMergedAccountByIndex(s_authInterface, localUserId, index);\n    return eosg_epic_account_id_to_string(accountId);\n}\n\nint IEOS::auth_interface_get_merged_accounts_count(const String &p_local_user_id) {\n    ERR_FAIL_NULL_V(s_authInterface, 0);\n    CharString local_user_id = p_local_user_id.utf8();\n    EOS_EpicAccountId localUserId = eosg_string_to_epic_account_id(local_user_id.get_data());\n    return static_cast<int>(EOS_Auth_GetMergedAccountsCount(s_authInterface, localUserId));\n}\n\nDictionary IEOS::auth_interface_get_selected_account_id(const String &p_local_user_id) {\n    ERR_FAIL_NULL_V(s_authInterface, {});\n    CharString local_user_id = p_local_user_id.utf8();\n    EOS_EpicAccountId localUserId = eosg_string_to_epic_account_id(local_user_id.get_data());\n    EOS_EpicAccountId outSelectedAccountId = nullptr;\n    EOS_EResult res = EOS_Auth_GetSelectedAccountId(s_authInterface, localUserId, &outSelectedAccountId);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"selected_account_id\"] = eosg_epic_account_id_to_string(outSelectedAccountId);\n    return ret;\n}\n\nvoid IEOS::auth_interface_query_id_token(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_authInterface);\n    CharString p_local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString p_target_account_id = VARIANT_TO_CHARSTRING(p_options->get(\"target_account_id\"));\n\n    EOS_Auth_QueryIdTokenOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_AUTH_QUERYIDTOKEN_API_LATEST;\n    options.LocalUserId = eosg_string_to_epic_account_id(p_local_user_id.get_data());\n    options.TargetAccountId = eosg_string_to_epic_account_id(p_target_account_id.get_data());\n    p_options->reference();\n\n    EOS_Auth_QueryIdToken(s_authInterface, &options, (void *)*p_options, [](const EOS_Auth_QueryIdTokenCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"local_user_id\"] = eosg_epic_account_id_to_string(data->LocalUserId);\n        ret[\"target_account_id\"] = eosg_epic_account_id_to_string(data->TargetAccountId);\n        IEOS::get_singleton()->emit_signal(\"auth_interface_query_id_token_callback\", ret);\n    });\n}\n\nvoid IEOS::auth_interface_verify_id_token(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_authInterface);\n    Ref<RefCounted> p_id_token = p_options->get(\"id_token\");\n    CharString p_account_id = VARIANT_TO_CHARSTRING(p_id_token->get(\"account_id\"));\n    CharString p_json_web_token = VARIANT_TO_CHARSTRING(p_id_token->get(\"json_web_token\"));\n\n    EOS_Auth_IdToken idToken;\n    memset(&idToken, 0, sizeof(idToken));\n    idToken.ApiVersion = EOS_AUTH_IDTOKEN_API_LATEST;\n    idToken.AccountId = eosg_string_to_epic_account_id(p_account_id.get_data());\n    idToken.JsonWebToken = p_json_web_token.get_data();\n\n    EOS_Auth_VerifyIdTokenOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_AUTH_VERIFYIDTOKEN_API_LATEST;\n    options.IdToken = &idToken;\n    p_options->reference();\n\n    EOS_Auth_VerifyIdToken(s_authInterface, &options, (void *)*p_options, [](const EOS_Auth_VerifyIdTokenCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"application_id\"] = EOSG_GET_STRING(data->ApplicationId);\n        ret[\"client_id\"] = EOSG_GET_STRING(data->ClientId);\n        ret[\"product_id\"] = EOSG_GET_STRING(data->ProductId);\n        ret[\"sandbox_id\"] = EOSG_GET_STRING(data->SandboxId);\n        ret[\"deployment_id\"] = EOSG_GET_STRING(data->DeploymentId);\n        ret[\"display_name\"] = EOSG_GET_STRING(data->DisplayName);\n        ret[\"is_external_account_info_present\"] = EOSG_GET_BOOL(data->bIsExternalAccountInfoPresent);\n        ret[\"external_account_id_type\"] = static_cast<int>(data->ExternalAccountIdType);\n        ret[\"external_account_id\"] = EOSG_GET_STRING(data->ExternalAccountId);\n        ret[\"external_account_display_name\"] = EOSG_GET_STRING(data->ExternalAccountDisplayName);\n        ret[\"platform\"] = EOSG_GET_STRING(data->Platform);\n        IEOS::get_singleton()->emit_signal(\"auth_interface_verify_id_token_callback\", ret);\n    });\n}\n\nvoid IEOS::auth_interface_link_account(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_authInterface);\n    Ref<EOSGContinuanceToken> p_continuance_token = Object::cast_to<EOSGContinuanceToken>(p_options->get(\"continuance_token\"));\n    ERR_FAIL_NULL_MSG(p_continuance_token, \"Error linking account. LinkAccountOptions.continuance_token is null.\");\n    ERR_FAIL_NULL_MSG(p_continuance_token->get_internal(), \"Error linking account. EOSGContinuanceToken is null.\");\n\n    CharString p_local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n\n    EOS_Auth_LinkAccountOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_AUTH_LINKACCOUNT_API_LATEST;\n    options.LinkAccountFlags = static_cast<EOS_ELinkAccountFlags>((int)p_options->get(\"link_account_flags\"));\n    options.ContinuanceToken = p_continuance_token->get_internal();\n    options.LocalUserId = eosg_string_to_epic_account_id(p_local_user_id.get_data());\n    p_options->reference();\n\n    EOS_Auth_LinkAccount(s_authInterface, &options, (void *)*p_options, [](const EOS_Auth_LinkAccountCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"local_user_id\"] = eosg_epic_account_id_to_string(data->LocalUserId);\n        ret[\"pin_grant_info\"] = eosg_auth_pin_grant_info_to_dict(data->PinGrantInfo);\n        ret[\"selected_account_id\"] = eosg_epic_account_id_to_string(data->SelectedAccountId);\n        IEOS::get_singleton()->emit_signal(\"auth_interface_link_account_callback\", ret);\n    });\n}\n\nvoid IEOS::auth_interface_verify_user_auth(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_authInterface);\n    Ref<RefCounted> p_auth_token = Object::cast_to<RefCounted>(p_options->get(\"auth_token\"));\n    CharString p_app = VARIANT_TO_CHARSTRING(p_auth_token->get(\"app\"));\n    CharString p_client_id = VARIANT_TO_CHARSTRING(p_auth_token->get(\"client_id\"));\n    CharString p_access_token = VARIANT_TO_CHARSTRING(p_auth_token->get(\"access_token\"));\n    CharString p_expires_at = VARIANT_TO_CHARSTRING(p_auth_token->get(\"expires_at\"));\n    CharString p_refresh_token = VARIANT_TO_CHARSTRING(p_auth_token->get(\"refresh_token\"));\n    CharString p_refresh_expires_at = VARIANT_TO_CHARSTRING(p_auth_token->get(\"refresh_expires_at\"));\n    CharString p_account_id = VARIANT_TO_CHARSTRING(p_auth_token->get(\"account_id\"));\n    int p_auth_type = p_auth_token->get(\"auth_type\");\n    EOS_EpicAccountId accountId = eosg_string_to_epic_account_id(p_account_id.get_data());\n\n    EOS_Auth_Token authToken;\n    memset(&authToken, 0, sizeof(authToken));\n    authToken.ApiVersion = EOS_AUTH_TOKEN_API_LATEST;\n    authToken.App = p_app.get_data();\n    authToken.ClientId = p_client_id.get_data();\n    authToken.AccessToken = p_access_token.get_data();\n    authToken.ExpiresAt = p_expires_at.get_data();\n    authToken.RefreshToken = p_refresh_token.get_data();\n    authToken.RefreshExpiresAt = p_refresh_expires_at.get_data();\n    authToken.AccountId = accountId;\n    authToken.AuthType = static_cast<EOS_EAuthTokenType>(p_auth_type);\n    authToken.RefreshExpiresIn = static_cast<double>(p_auth_token->get(\"refresh_expires_in\"));\n    authToken.ExpiresIn = static_cast<double>(p_auth_token->get(\"expires_in\"));\n\n    EOS_Auth_VerifyUserAuthOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_AUTH_VERIFYUSERAUTH_API_LATEST;\n    options.AuthToken = &authToken;\n    p_options->reference();\n\n    EOS_Auth_VerifyUserAuth(s_authInterface, &options, (void *)*p_options, [](const EOS_Auth_VerifyUserAuthCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        IEOS::get_singleton()->emit_signal(\"auth_interface_verify_user_auth_callback\", ret);\n    });\n}\n"
  },
  {
    "path": "src/connect_interface.cpp",
    "content": "#include \"ieos.h\"\nusing namespace godot;\n\nvoid IEOS::connect_interface_login(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL(s_connectInterface);\n    Ref<RefCounted> p_credentials = p_options->get(\"credentials\");\n    Ref<RefCounted> p_user_login_info = p_options->get(\"user_login_info\");\n    CharString token = VARIANT_TO_CHARSTRING(p_credentials->get(\"token\"));\n    String p_display_name;\n    String p_nsa_id_token;\n    if (p_user_login_info != nullptr) {\n        p_display_name = p_user_login_info->get(\"display_name\");\n        p_nsa_id_token = p_user_login_info->get(\"nsa_id_token\");\n    }\n    CharString display_name = p_display_name.utf8();\n    CharString nsa_id_token = p_nsa_id_token.utf8();\n\n    EOS_Connect_Credentials credentials;\n    memset(&credentials, 0, sizeof(credentials));\n    credentials.ApiVersion = EOS_CONNECT_CREDENTIALS_API_LATEST;\n    credentials.Type = static_cast<EOS_EExternalCredentialType>((int)p_credentials->get(\"type\"));\n    if (credentials.Type == EOS_EExternalCredentialType::EOS_ECT_DEVICEID_ACCESS_TOKEN) {\n        credentials.Token = nullptr; //It needs to be nullptr for deviceid, otherwise login will fail\n    } else {\n        credentials.Token = token.get_data();\n    }\n\n    EOS_Connect_UserLoginInfo userLoginInfo;\n    memset(&userLoginInfo, 0, sizeof(userLoginInfo));\n    if (!p_display_name.is_empty()) {\n        userLoginInfo.ApiVersion = EOS_CONNECT_USERLOGININFO_API_LATEST;\n        userLoginInfo.DisplayName = display_name.get_data();\n    }\n    if (!p_nsa_id_token.is_empty()) {\n        userLoginInfo.ApiVersion = EOS_CONNECT_USERLOGININFO_API_LATEST;\n        userLoginInfo.NsaIdToken = nsa_id_token.get_data();\n    }\n\n    EOS_Connect_LoginOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_CONNECT_LOGIN_API_LATEST;\n    options.Credentials = &credentials;\n    if (!p_display_name.is_empty()) {\n        options.UserLoginInfo = &userLoginInfo;\n    }\n    p_options->reference();\n\n    EOS_Connect_Login(s_connectInterface, &options, (void *)*p_options, [](const EOS_Connect_LoginCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"continuance_token\"] = eosg_continuance_token_to_wrapper(data->ContinuanceToken);\n        ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n\n        if (data->ResultCode == EOS_EResult::EOS_Success) {\n            ret[\"success\"] = true;\n            ret[\"pending\"] = false;\n        } else if (EOS_EResult_IsOperationComplete(data->ResultCode)) {\n            ret[\"success\"] = false;\n            ret[\"pending\"] = true;\n        } else {\n            ret[\"success\"] = false;\n            ret[\"pending\"] = false;\n        }\n\n        IEOS::get_singleton()->emit_signal(\"connect_interface_login_callback\", ret);\n    });\n}\n\nvoid IEOS::connect_interface_logout(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL(s_connectInterface);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n\n    EOS_Connect_LogoutOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_CONNECT_LOGOUT_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    p_options->reference();\n\n    EOS_Connect_Logout(s_connectInterface, &options, (void *)*p_options, [](const EOS_Connect_LogoutCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n        IEOS::get_singleton()->emit_signal(\"connect_interface_logout_callback\", ret);\n    });\n}\n\nDictionary IEOS::connect_interface_copy_id_token(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL_V(s_connectInterface, {});\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n\n    EOS_Connect_CopyIdTokenOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_AUTH_COPYIDTOKEN_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n\n    EOS_Connect_IdToken *outToken = nullptr;\n    EOS_EResult res = EOS_Connect_CopyIdToken(s_connectInterface, &options, &outToken);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"id_token\"] = eosg_connect_id_token_to_dict_and_release(outToken);\n    return ret;\n}\n\nDictionary IEOS::connect_interface_copy_product_user_external_account_by_account_id(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL_V(s_connectInterface, {});\n    CharString target_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"target_user_id\"));\n    CharString account_id = VARIANT_TO_CHARSTRING(p_options->get(\"account_id\"));\n\n    EOS_Connect_CopyProductUserExternalAccountByAccountIdOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_CONNECT_COPYPRODUCTUSEREXTERNALACCOUNTBYACCOUNTID_API_LATEST;\n    options.TargetUserId = eosg_string_to_product_user_id(target_user_id.get_data());\n    options.AccountId = account_id.get_data();\n\n    EOS_Connect_ExternalAccountInfo *outExternalAccountInfo = nullptr;\n\n    EOS_EResult res = EOS_Connect_CopyProductUserExternalAccountByAccountId(s_connectInterface, &options, &outExternalAccountInfo);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"external_account_info\"] = eosg_connect_external_account_info_to_dict_and_release(outExternalAccountInfo);\n    return ret;\n}\n\nDictionary IEOS::connect_interface_copy_product_user_external_account_by_account_type(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL_V(s_connectInterface, {});\n    CharString target_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"target_user_id\"));\n    int account_id_type = p_options->get(\"account_id_type\");\n\n    EOS_Connect_CopyProductUserExternalAccountByAccountTypeOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_CONNECT_COPYPRODUCTUSEREXTERNALACCOUNTBYACCOUNTTYPE_API_LATEST;\n    options.TargetUserId = eosg_string_to_product_user_id(target_user_id.get_data());\n    options.AccountIdType = static_cast<EOS_EExternalAccountType>(account_id_type);\n\n    EOS_Connect_ExternalAccountInfo *outExternalAccountInfo = nullptr;\n    EOS_EResult res = EOS_Connect_CopyProductUserExternalAccountByAccountType(s_connectInterface, &options, &outExternalAccountInfo);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"external_account_info\"] = eosg_connect_external_account_info_to_dict_and_release(outExternalAccountInfo);\n    return ret;\n}\n\nDictionary IEOS::connect_interface_copy_product_user_external_account_by_index(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL_V(s_connectInterface, {});\n    CharString target_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"target_user_id\"));\n\n    EOS_Connect_CopyProductUserExternalAccountByIndexOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_CONNECT_COPYPRODUCTUSEREXTERNALACCOUNTBYINDEX_API_LATEST;\n    options.TargetUserId = eosg_string_to_product_user_id(target_user_id.get_data());\n    options.ExternalAccountInfoIndex = static_cast<uint32_t>(static_cast<int>(p_options->get(\"external_account_info_index\")));\n\n    EOS_Connect_ExternalAccountInfo *outExternalAccountInfo = nullptr;\n    EOS_EResult res = EOS_Connect_CopyProductUserExternalAccountByIndex(s_connectInterface, &options, &outExternalAccountInfo);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"external_account_info\"] = eosg_connect_external_account_info_to_dict_and_release(outExternalAccountInfo);\n    return ret;\n}\n\nDictionary IEOS::connect_interface_copy_product_user_info(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL_V(s_connectInterface, {});\n    CharString target_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"target_user_id\"));\n\n    EOS_Connect_CopyProductUserInfoOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_CONNECT_COPYPRODUCTUSERINFO_API_LATEST;\n    options.TargetUserId = eosg_string_to_product_user_id(target_user_id.get_data());\n\n    EOS_Connect_ExternalAccountInfo *outExternalAccountInfo = nullptr;\n    EOS_EResult res = EOS_Connect_CopyProductUserInfo(s_connectInterface, &options, &outExternalAccountInfo);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"external_account_info\"] = eosg_connect_external_account_info_to_dict_and_release(outExternalAccountInfo);\n    return ret;\n}\n\nvoid IEOS::connect_interface_create_device_id(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL(s_connectInterface);\n    CharString p_device_model = VARIANT_TO_CHARSTRING(p_options->get(\"device_model\"));\n\n    EOS_Connect_CreateDeviceIdOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_CONNECT_CREATEDEVICEID_API_LATEST;\n    options.DeviceModel = p_device_model.get_data();\n    p_options->reference();\n\n    EOS_Connect_CreateDeviceId(s_connectInterface, &options, (void *)*p_options, [](const EOS_Connect_CreateDeviceIdCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        IEOS::get_singleton()->emit_signal(\"connect_interface_create_device_id_callback\", ret);\n    });\n}\n\nvoid IEOS::connect_interface_delete_device_id(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_connectInterface);\n\tEOS_Connect_DeleteDeviceIdOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_CONNECT_DELETEDEVICEID_API_LATEST;\n\n    p_options->reference();\n    EOS_Connect_DeleteDeviceId(s_connectInterface, &options, (void *)*p_options, [](const EOS_Connect_DeleteDeviceIdCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        IEOS::get_singleton()->emit_signal(\"connect_interface_delete_device_id_callback\", ret);\n    });\n}\n\nvoid IEOS::connect_interface_create_user(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_connectInterface);\n    Ref<EOSGContinuanceToken> p_continuance_token = Object::cast_to<EOSGContinuanceToken>(p_options->get(\"continuance_token\"));\n    ERR_FAIL_NULL_MSG(p_continuance_token, \"Error linking account. LinkAccountOptions.continuance_token is null.\");\n    ERR_FAIL_NULL_MSG(p_continuance_token->get_internal(), \"Error linking account. EOSGContinuanceToken is null.\");\n\n    EOS_Connect_CreateUserOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_CONNECT_CREATEUSER_API_LATEST;\n    options.ContinuanceToken = p_continuance_token->get_internal();\n    p_options->reference();\n\n    EOS_Connect_CreateUser(s_connectInterface, &options, (void *)*p_options, [](const EOS_Connect_CreateUserCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n\n        IEOS::get_singleton()->emit_signal(\"connect_interface_create_user_callback\", ret);\n    });\n}\n\nString IEOS::connect_interface_get_external_account_mapping(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_connectInterface, \"\");\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString target_external_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"target_external_user_id\"));\n    int account_id_type = p_options->get(\"account_id_type\");\n\n    EOS_Connect_GetExternalAccountMappingsOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_CONNECT_GETEXTERNALACCOUNTMAPPINGS_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.AccountIdType = static_cast<EOS_EExternalAccountType>(account_id_type);\n    options.TargetExternalUserId = target_external_user_id.get_data();\n\n    return eosg_product_user_id_to_string(EOS_Connect_GetExternalAccountMapping(s_connectInterface, &options));\n}\n\nString IEOS::connect_interface_get_logged_in_user_by_index(int p_index) {\n    ERR_FAIL_NULL_V(s_connectInterface, \"\");\n    return eosg_product_user_id_to_string(EOS_Connect_GetLoggedInUserByIndex(s_connectInterface, p_index));\n}\n\nint IEOS::connect_interface_get_logged_in_users_count() {\n    ERR_FAIL_NULL_V(s_connectInterface, 0);\n    return static_cast<int>(EOS_Connect_GetLoggedInUsersCount(s_connectInterface));\n}\n\nint IEOS::connect_interface_get_login_status(const String &p_local_user_id) {\n    ERR_FAIL_NULL_V(s_connectInterface, static_cast<int>(EOS_ELoginStatus::EOS_LS_NotLoggedIn));\n    CharString local_user_id = p_local_user_id.utf8();\n    EOS_ProductUserId localUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n\n    return static_cast<int>(EOS_Connect_GetLoginStatus(s_connectInterface, localUserId));\n}\n\nint IEOS::connect_interface_get_product_user_external_account_count(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_connectInterface, 0);\n    CharString p_target_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"target_user_id\"));\n\n    EOS_Connect_GetProductUserExternalAccountCountOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_CONNECT_GETPRODUCTUSEREXTERNALACCOUNTCOUNT_API_LATEST;\n    options.TargetUserId = eosg_string_to_product_user_id(p_target_user_id.get_data());\n\n    return static_cast<int>(EOS_Connect_GetProductUserExternalAccountCount(s_connectInterface, &options));\n}\n\nDictionary IEOS::connect_interface_get_product_user_id_mapping(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_connectInterface, {});\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString target_product_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"target_product_user_id\"));\n    int account_id_type = p_options->get(\"account_id_type\");\n\n    EOS_Connect_GetProductUserIdMappingOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_CONNECT_GETPRODUCTUSERIDMAPPING_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.AccountIdType = static_cast<EOS_EExternalAccountType>(account_id_type);\n    options.TargetProductUserId = eosg_string_to_product_user_id(target_product_user_id.get_data());\n\n    char *outAccountId = (char *)memalloc(EOS_CONNECT_EXTERNAL_ACCOUNT_ID_MAX_LENGTH + 1);\n    int outAccountIdLength = EOS_CONNECT_EXTERNAL_ACCOUNT_ID_MAX_LENGTH + 1;\n    EOS_EResult res = EOS_Connect_GetProductUserIdMapping(s_connectInterface, &options, outAccountId, &outAccountIdLength);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"account_id\"] = EOSG_GET_STRING(outAccountId);\n    return ret;\n}\n\nvoid IEOS::connect_interface_query_product_user_id_mappings(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_connectInterface);\n    CharString p_local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    TypedArray<String> p_product_user_ids = p_options->get(\"product_user_ids\");\n\n    EOS_ProductUserId *product_user_ids = nullptr;\n\tPERSISTENT_CHAR_ARRAY_CREATE(product_user_ids_cstr, product_user_ids_cstr_charstrings, p_product_user_ids.size());\n    if (p_product_user_ids.size() > 0) {\n        product_user_ids = (EOS_ProductUserId *)memalloc(sizeof(EOS_ProductUserId) * p_product_user_ids.size());\n        for (int i = 0; i < p_product_user_ids.size(); i++) {\n\t\t\tPERSISTENT_CHAR_ARRAY_SET(product_user_ids_cstr, product_user_ids_cstr_charstrings, i, p_product_user_ids[i]);\n            product_user_ids[i] = eosg_string_to_product_user_id(product_user_ids_cstr[i]);\n        }\n    }\n\n    EOS_Connect_QueryProductUserIdMappingsOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_CONNECT_QUERYPRODUCTUSERIDMAPPINGS_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(p_local_user_id.get_data());\n    options.ProductUserIds = product_user_ids;\n    options.ProductUserIdCount = p_product_user_ids.size();\n    p_options->reference();\n\n    EOS_Connect_QueryProductUserIdMappings(s_connectInterface, &options, (void *)*p_options, [](const EOS_Connect_QueryProductUserIdMappingsCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n        IEOS::get_singleton()->emit_signal(\"connect_interface_query_product_user_id_mappings_callback\", ret);\n    });\n}\n\nvoid IEOS::connect_interface_query_external_account_mappings(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_connectInterface);\n    CharString p_local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    int p_account_id_type = p_options->get(\"account_id_type\");\n    TypedArray<String> p_external_account_ids = p_options->get(\"external_account_ids\");\n\n    const char **external_account_ids = nullptr;\n\tPERSISTENT_CHAR_ARRAY_CREATE(external_account_ids_cstr, external_account_ids_cstr_charstrings, p_external_account_ids.size());\n    if (p_external_account_ids.size() > 0) {\n        external_account_ids = (const char **)memalloc(sizeof(const char *) * p_external_account_ids.size());\n        for (int i = 0; i < p_external_account_ids.size(); i++) {\n\t\t\tPERSISTENT_CHAR_ARRAY_SET(external_account_ids_cstr, external_account_ids_cstr_charstrings, i, p_external_account_ids[i]);\n\t\t\texternal_account_ids[i] = external_account_ids_cstr[i];\n        }\n    }\n\n    EOS_Connect_QueryExternalAccountMappingsOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_CONNECT_QUERYEXTERNALACCOUNTMAPPINGS_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(p_local_user_id.get_data());\n    options.AccountIdType = static_cast<EOS_EExternalAccountType>(p_account_id_type);\n    options.ExternalAccountIds = external_account_ids;\n    options.ExternalAccountIdCount = p_external_account_ids.size();\n    p_options->reference();\n\n    EOS_Connect_QueryExternalAccountMappings(s_connectInterface, &options, (void *)*p_options, [](const EOS_Connect_QueryExternalAccountMappingsCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n        IEOS::get_singleton()->emit_signal(\"connect_interface_query_external_account_mappings_callback\", ret);\n    });\n}\n\nvoid IEOS::connect_interface_link_account(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_connectInterface);\n    Ref<EOSGContinuanceToken> p_continuance_token = Object::cast_to<EOSGContinuanceToken>(p_options->get(\"continuance_token\"));\n    ERR_FAIL_NULL_MSG(p_continuance_token, \"Error linking account. LinkAccountOptions.continuance_token is null.\");\n    ERR_FAIL_NULL_MSG(p_continuance_token->get_internal(), \"Error linking account. EOSGContinuanceToken is null.\");\n\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n\n    EOS_Connect_LinkAccountOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_CONNECT_LINKACCOUNT_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.ContinuanceToken = p_continuance_token->get_internal();\n    p_options->reference();\n\n    EOS_Connect_LinkAccount(s_connectInterface, &options, (void *)*p_options, [](const EOS_Connect_LinkAccountCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n        IEOS::get_singleton()->emit_signal(\"connect_interface_link_account_callback\", ret);\n    });\n}\n\nvoid IEOS::connect_interface_verify_id_token(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_connectInterface);\n    Ref<RefCounted> p_id_token = p_options->get(\"id_token\");\n    CharString p_product_user_id = VARIANT_TO_CHARSTRING(p_id_token->get(\"product_user_id\"));\n    CharString p_json_web_token = VARIANT_TO_CHARSTRING(p_id_token->get(\"json_web_token\"));\n\n    EOS_Connect_IdToken idToken;\n    memset(&idToken, 0, sizeof(idToken));\n    idToken.ApiVersion = EOS_CONNECT_IDTOKEN_API_LATEST;\n    idToken.ProductUserId = eosg_string_to_product_user_id(p_product_user_id.get_data());\n    idToken.JsonWebToken = p_json_web_token.get_data();\n\n    EOS_Connect_VerifyIdTokenOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_CONNECT_VERIFYIDTOKEN_API_LATEST;\n    options.IdToken = &idToken;\n\n    EOS_Connect_VerifyIdToken(s_connectInterface, &options, (void *)*p_options, [](const EOS_Connect_VerifyIdTokenCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"product_user_id\"] = eosg_product_user_id_to_string(data->ProductUserId);\n        ret[\"is_account_info_present\"] = EOSG_GET_BOOL(data->bIsAccountInfoPresent);\n        ret[\"account_id_type\"] = static_cast<int>(data->AccountIdType);\n        ret[\"account_id\"] = EOSG_GET_STRING(data->AccountId);\n        IEOS::get_singleton()->emit_signal(\"connect_interface_verify_id_token_callback\", ret);\n    });\n}\n\nvoid IEOS::connect_interface_transfer_device_id_account(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_connectInterface);\n    String p_primary_local_user_id = p_options->get(\"primary_local_user_id\");\n    CharString primary_local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"primary_local_user_id\"));\n    CharString local_device_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_device_user_id\"));\n    String p_product_user_id_to_preserve = p_options->get(\"product_user_id_to_preserve\");\n    CharString product_user_id_to_preserve = VARIANT_TO_CHARSTRING(p_options->get(\"product_user_id_to_preserve\"));\n\n    EOS_ProductUserId primaryLocalUserId = eosg_string_to_product_user_id(primary_local_user_id.get_data());\n    EOS_ProductUserId localDeviceUserId = eosg_string_to_product_user_id(local_device_user_id.get_data());\n\n    EOS_Connect_TransferDeviceIdAccountOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_CONNECT_TRANSFERDEVICEIDACCOUNT_API_LATEST;\n    options.PrimaryLocalUserId = primaryLocalUserId;\n    options.LocalDeviceUserId = localDeviceUserId;\n    if (p_product_user_id_to_preserve == p_primary_local_user_id) {\n        options.ProductUserIdToPreserve = primaryLocalUserId;\n    } else {\n        options.PrimaryLocalUserId = localDeviceUserId;\n    }\n    p_options->reference();\n\n    EOS_Connect_TransferDeviceIdAccount(s_connectInterface, &options, (void *)*p_options, [](const EOS_Connect_TransferDeviceIdAccountCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n        IEOS::get_singleton()->emit_signal(\"connect_interface_transfer_device_id_account_callback\", ret);\n    });\n}\n\nvoid IEOS::connect_interface_unlink_account(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_connectInterface);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n\n    EOS_Connect_UnlinkAccountOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_CONNECT_UNLINKACCOUNT_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    p_options->reference();\n\n    EOS_Connect_UnlinkAccount(s_connectInterface, &options, (void *)*p_options, [](const EOS_Connect_UnlinkAccountCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n        IEOS::get_singleton()->emit_signal(\"connect_interface_unlink_account_callback\", ret);\n    });\n}\n"
  },
  {
    "path": "src/custom_invites_interface.cpp",
    "content": "#include \"ieos.h\"\nusing namespace std;\n\nint IEOS::custom_invites_interface_finalize_invite(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL_V(s_customInvitesInterface, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString target_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"target_user_id\"));\n    CharString custom_invite_id = VARIANT_TO_CHARSTRING(p_options->get(\"custom_invite_id\"));\n\n    EOS_CustomInvites_FinalizeInviteOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_CUSTOMINVITES_FINALIZEINVITE_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.TargetUserId = eosg_string_to_product_user_id(target_user_id.get_data());\n    options.CustomInviteId = custom_invite_id.get_data();\n    options.ProcessingResult = static_cast<EOS_EResult>(static_cast<int>(p_options->get(\"processing_result\")));\n\n    return static_cast<int>(EOS_CustomInvites_FinalizeInvite(s_customInvitesInterface, &options));\n}\n\nvoid IEOS::custom_invites_interface_send_custom_invite(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL(s_customInvitesInterface);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    Array p_target_user_ids = p_options->get(\"target_user_ids\");\n    int target_user_ids_count = p_target_user_ids.size();\n\n    EOS_ProductUserId *targetUserIds = (EOS_ProductUserId *)memalloc(sizeof(EOS_ProductUserId) * target_user_ids_count);\n\tPERSISTENT_CHAR_ARRAY_CREATE(target_user_ids, target_user_ids_charstrings, target_user_ids_count)\n    for (int i = 0; i < target_user_ids_count; i++) {\n        PERSISTENT_CHAR_ARRAY_SET(target_user_ids, target_user_ids_charstrings, i, p_target_user_ids[i]);\n        targetUserIds[i] = eosg_string_to_product_user_id(target_user_ids[i]);\n    }\n\n    EOS_CustomInvites_SendCustomInviteOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_CUSTOMINVITES_SENDCUSTOMINVITE_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.TargetUserIds = targetUserIds;\n    options.TargetUserIdsCount = target_user_ids_count;\n    p_options->reference();\n\n    EOS_CustomInvites_SendCustomInvite(s_customInvitesInterface, &options, (void *)*p_options, [](const EOS_CustomInvites_SendCustomInviteCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n\n        Array target_user_ids = Array();\n        for (int i = 0; i < data->TargetUserIdsCount; i++) {\n            target_user_ids.append(eosg_product_user_id_to_string(data->TargetUserIds[i]));\n        }\n        ret[\"target_user_ids\"] = target_user_ids;\n        IEOS::get_singleton()->emit_signal(\"custom_invites_interface_send_custom_invite_callback\", ret);\n    });\n}\n\nint IEOS::custom_invites_interface_set_custom_invite(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL_V(s_customInvitesInterface, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString payload = VARIANT_TO_CHARSTRING(p_options->get(\"payload\"));\n\n    EOS_CustomInvites_SetCustomInviteOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_CUSTOMINVITES_SETCUSTOMINVITE_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.Payload = payload.get_data();\n\n    return static_cast<int>(EOS_CustomInvites_SetCustomInvite(s_customInvitesInterface, &options));\n}\n\nvoid IEOS::custom_invites_interface_send_request_to_join(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL(s_customInvitesInterface);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString target_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"target_user_id\"));\n\n    EOS_CustomInvites_SendRequestToJoinOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_CUSTOMINVITES_SENDREQUESTTOJOIN_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.TargetUserId = eosg_string_to_product_user_id(target_user_id.get_data());\n    p_options->reference();\n\n    EOS_CustomInvites_SendRequestToJoin(s_customInvitesInterface, &options, (void *)*p_options, [](const EOS_CustomInvites_SendRequestToJoinCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n\n        ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n        ret[\"target_user_id\"] = eosg_product_user_id_to_string(data->TargetUserId);\n\n        IEOS::get_singleton()->emit_signal(\"custom_invites_interface_send_request_to_join_callback\", ret);\n    });\n}\n\n// TODO: impl EOS_CustomInvites_AddNotifySendCustomNativeInviteRequested\n// TODO: impl EOS_CustomInvites_RemoveNotifySendCustomNativeInviteRequested\n\nvoid IEOS::custom_invites_interface_accept_request_to_join(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL(s_customInvitesInterface);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString target_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"target_user_id\"));\n\n    EOS_CustomInvites_AcceptRequestToJoinOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_CUSTOMINVITES_ACCEPTREQUESTTOJOIN_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.TargetUserId = eosg_string_to_product_user_id(target_user_id.get_data());\n    p_options->reference();\n\n    EOS_CustomInvites_AcceptRequestToJoin(s_customInvitesInterface, &options, (void *)*p_options, [](const EOS_CustomInvites_AcceptRequestToJoinCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n\n        ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n        ret[\"target_user_id\"] = eosg_product_user_id_to_string(data->TargetUserId);\n\n        IEOS::get_singleton()->emit_signal(\"custom_invites_interface_accept_request_to_join_callback\", ret);\n    });\n}\n\nvoid IEOS::custom_invites_interface_reject_request_to_join(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL(s_customInvitesInterface);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString target_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"target_user_id\"));\n\n    EOS_CustomInvites_RejectRequestToJoinOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_CUSTOMINVITES_REJECTREQUESTTOJOIN_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.TargetUserId = eosg_string_to_product_user_id(target_user_id.get_data());\n    p_options->reference();\n\n    EOS_CustomInvites_RejectRequestToJoin(s_customInvitesInterface, &options, (void *)*p_options, [](const EOS_CustomInvites_RejectRequestToJoinCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n\n        ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n        ret[\"target_user_id\"] = eosg_product_user_id_to_string(data->TargetUserId);\n\n        IEOS::get_singleton()->emit_signal(\"custom_invites_interface_reject_request_to_join_callback\", ret);\n    });\n}"
  },
  {
    "path": "src/ecom_interface.cpp",
    "content": "#include \"ieos.h\"\nusing namespace std;\n\nvoid IEOS::ecom_interface_checkout(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL(s_ecomInterface);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString override_catalog_namespace = VARIANT_TO_CHARSTRING(p_options->get(\"override_catalog_namespace\"));\n\tint preferred_orientation = p_options->get(\"preferred_orientation\");\n\n    EOS_Ecom_CheckoutOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ECOM_CHECKOUT_API_LATEST;\n    options.LocalUserId = eosg_string_to_epic_account_id(local_user_id.get_data());\n\toptions.PreferredOrientation = static_cast<EOS_ECheckoutOrientation>(preferred_orientation);\n    if (override_catalog_namespace.length() > 0) {\n        options.OverrideCatalogNamespace = override_catalog_namespace.get_data();\n    }\n\n    TypedArray<Dictionary> p_entries = p_options->get(\"entries\");\n    options.EntryCount = static_cast<uint32_t>(p_entries.size());\n    EOS_Ecom_CheckoutEntry *entries = nullptr;\n    if (options.EntryCount > 0) {\n        entries = (EOS_Ecom_CheckoutEntry *)memalloc(sizeof(EOS_Ecom_CheckoutEntry) * options.EntryCount);\n        for (int i = 0; i < options.EntryCount; i++) {\n            entries[i].ApiVersion = EOS_ECOM_CHECKOUTENTRY_API_LATEST;\n            entries[i].OfferId = VARIANT_TO_CHARSTRING(p_entries[i].get(\"offer_id\")).get_data();\n        }\n    }\n\n    options.Entries = entries;\n\n    p_options->reference();\n\n    EOS_Ecom_Checkout(s_ecomInterface, &options, (void *)*p_options, [](const EOS_Ecom_CheckoutCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"local_user_id\"] = eosg_epic_account_id_to_string(data->LocalUserId);\n        ret[\"transaction_id\"] = String(data->TransactionId);\n        IEOS::get_singleton()->emit_signal(\"ecom_interface_checkout_callback\", ret);\n    });\n}\n\nDictionary IEOS::ecom_interface_copy_entitlement_by_id(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL_V(s_ecomInterface, {});\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString entitlement_id = VARIANT_TO_CHARSTRING(p_options->get(\"entitlement_id\"));\n\n    EOS_Ecom_CopyEntitlementByIdOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ECOM_COPYENTITLEMENTBYID_API_LATEST;\n    options.LocalUserId = eosg_string_to_epic_account_id(local_user_id.get_data());\n    options.EntitlementId = entitlement_id.get_data();\n\n    EOS_Ecom_Entitlement *outEntitlement = nullptr;\n    EOS_EResult res = EOS_Ecom_CopyEntitlementById(s_ecomInterface, &options, &outEntitlement);\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"entitlement\"] = eosg_ecom_entitlement_to_dict_and_release(outEntitlement);\n    return ret;\n}\n\nDictionary IEOS::ecom_interface_copy_entitlement_by_index(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL_V(s_ecomInterface, {});\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n\n    EOS_Ecom_CopyEntitlementByIndexOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ECOM_COPYENTITLEMENTBYINDEX_API_LATEST;\n    options.LocalUserId = eosg_string_to_epic_account_id(local_user_id.get_data());\n    options.EntitlementIndex = static_cast<uint32_t>(p_options->get(\"entitlement_index\"));\n\n    EOS_Ecom_Entitlement *outEntitlement = nullptr;\n    EOS_EResult res = EOS_Ecom_CopyEntitlementByIndex(s_ecomInterface, &options, &outEntitlement);\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"entitlement\"] = eosg_ecom_entitlement_to_dict_and_release(outEntitlement);\n    return ret;\n}\n\nDictionary IEOS::ecom_interface_copy_entitlement_by_name_and_index(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL_V(s_ecomInterface, {});\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString entitlement_name = VARIANT_TO_CHARSTRING(p_options->get(\"entitlement_name\"));\n\n    EOS_Ecom_CopyEntitlementByNameAndIndexOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ECOM_COPYENTITLEMENTBYNAMEANDINDEX_API_LATEST;\n    options.LocalUserId = eosg_string_to_epic_account_id(local_user_id.get_data());\n    options.EntitlementName = entitlement_name.get_data();\n    options.Index = static_cast<uint32_t>(p_options->get(\"index\"));\n\n    EOS_Ecom_Entitlement *outEntitlement = nullptr;\n    EOS_EResult res = EOS_Ecom_CopyEntitlementByNameAndIndex(s_ecomInterface, &options, &outEntitlement);\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"entitlement\"] = eosg_ecom_entitlement_to_dict_and_release(outEntitlement);\n    return ret;\n}\n\nDictionary IEOS::ecom_interface_copy_item_by_id(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL_V(s_ecomInterface, {});\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString item_id = VARIANT_TO_CHARSTRING(p_options->get(\"item_id\"));\n\n    EOS_Ecom_CopyItemByIdOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ECOM_COPYITEMBYID_API_LATEST;\n    options.LocalUserId = eosg_string_to_epic_account_id(local_user_id.get_data());\n    options.ItemId = item_id.get_data();\n\n    EOS_Ecom_CatalogItem *outItem = nullptr;\n    EOS_EResult res = EOS_Ecom_CopyItemById(s_ecomInterface, &options, &outItem);\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"item\"] = eosg_ecom_catalog_item_to_dict_and_release(outItem);\n    return ret;\n}\n\nDictionary IEOS::ecom_interface_copy_item_image_info_by_index(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL_V(s_ecomInterface, {});\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString item_id = VARIANT_TO_CHARSTRING(p_options->get(\"item_id\"));\n    int image_info_index = p_options->get(\"image_info_index\");\n\n    EOS_Ecom_CopyItemImageInfoByIndexOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ECOM_COPYITEMIMAGEINFOBYINDEX_API_LATEST;\n    options.LocalUserId = eosg_string_to_epic_account_id(local_user_id.get_data());\n    options.ItemId = item_id.get_data();\n    options.ImageInfoIndex = static_cast<uint32_t>(image_info_index);\n\n    EOS_Ecom_KeyImageInfo *outImageInfo = nullptr;\n    EOS_EResult res = EOS_Ecom_CopyItemImageInfoByIndex(s_ecomInterface, &options, &outImageInfo);\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"image_info\"] = eosg_ecom_key_image_info_to_dict_and_release(outImageInfo);\n    return ret;\n}\n\nDictionary IEOS::ecom_interface_copy_item_release_by_index(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL_V(s_ecomInterface, {});\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString item_id = VARIANT_TO_CHARSTRING(p_options->get(\"item_id\"));\n    int release_index = p_options->get(\"release_index\");\n\n    EOS_Ecom_CopyItemReleaseByIndexOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ECOM_COPYITEMRELEASEBYINDEX_API_LATEST;\n    options.LocalUserId = eosg_string_to_epic_account_id(local_user_id.get_data());\n    options.ItemId = item_id.get_data();\n    options.ReleaseIndex = static_cast<uint32_t>(release_index);\n\n    EOS_Ecom_CatalogRelease *outRelease = nullptr;\n    EOS_EResult res = EOS_Ecom_CopyItemReleaseByIndex(s_ecomInterface, &options, &outRelease);\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"release\"] = eosg_ecom_catalog_release_to_dict_and_release(outRelease);\n    return ret;\n}\n\nDictionary IEOS::ecom_interface_copy_offer_by_id(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL_V(s_ecomInterface, {});\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString offer_id = VARIANT_TO_CHARSTRING(p_options->get(\"offer_id\"));\n\n    EOS_Ecom_CopyOfferByIdOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ECOM_COPYOFFERBYID_API_LATEST;\n    options.LocalUserId = eosg_string_to_epic_account_id(local_user_id.get_data());\n    options.OfferId = offer_id.get_data();\n\n    EOS_Ecom_CatalogOffer *outOffer = nullptr;\n    EOS_EResult res = EOS_Ecom_CopyOfferById(s_ecomInterface, &options, &outOffer);\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"offer\"] = eosg_ecom_catalog_offer_to_dict_and_release(outOffer);\n    return ret;\n}\n\nDictionary IEOS::ecom_interface_copy_offer_by_index(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL_V(s_ecomInterface, {});\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    int offer_index = p_options->get(\"offer_index\");\n\n    EOS_Ecom_CopyOfferByIndexOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ECOM_COPYOFFERBYINDEX_API_LATEST;\n    options.LocalUserId = eosg_string_to_epic_account_id(local_user_id.get_data());\n    options.OfferIndex = static_cast<uint32_t>(offer_index);\n\n    EOS_Ecom_CatalogOffer *outOffer = nullptr;\n    EOS_EResult res = EOS_Ecom_CopyOfferByIndex(s_ecomInterface, &options, &outOffer);\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"offer\"] = eosg_ecom_catalog_offer_to_dict_and_release(outOffer);\n    return ret;\n}\n\nDictionary IEOS::ecom_interface_copy_offer_image_info_by_index(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL_V(s_ecomInterface, {});\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString offer_id = VARIANT_TO_CHARSTRING(p_options->get(\"offer_id\"));\n    int image_info_index = p_options->get(\"image_info_index\");\n\n    EOS_Ecom_CopyOfferImageInfoByIndexOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ECOM_COPYOFFERIMAGEINFOBYINDEX_API_LATEST;\n    options.LocalUserId = eosg_string_to_epic_account_id(local_user_id.get_data());\n    options.OfferId = offer_id.get_data();\n    options.ImageInfoIndex = static_cast<uint32_t>(image_info_index);\n\n    EOS_Ecom_KeyImageInfo *outImageInfo = nullptr;\n    EOS_EResult res = EOS_Ecom_CopyOfferImageInfoByIndex(s_ecomInterface, &options, &outImageInfo);\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"image_info\"] = eosg_ecom_key_image_info_to_dict_and_release(outImageInfo);\n    return ret;\n}\n\nDictionary IEOS::ecom_interface_copy_offer_item_by_index(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL_V(s_ecomInterface, {});\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString offer_id = VARIANT_TO_CHARSTRING(p_options->get(\"offer_id\"));\n    int image_index = p_options->get(\"item_index\");\n\n    EOS_Ecom_CopyOfferItemByIndexOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ECOM_COPYOFFERITEMBYINDEX_API_LATEST;\n    options.LocalUserId = eosg_string_to_epic_account_id(local_user_id.get_data());\n    options.OfferId = offer_id.get_data();\n    options.ItemIndex = static_cast<uint32_t>(image_index);\n\n    EOS_Ecom_CatalogItem *outItem = nullptr;\n    EOS_EResult res = EOS_Ecom_CopyOfferItemByIndex(s_ecomInterface, &options, &outItem);\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"item\"] = eosg_ecom_catalog_item_to_dict_and_release(outItem);\n    return ret;\n}\n\nDictionary IEOS::ecom_interface_copy_transaction_by_id(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL_V(s_ecomInterface, {});\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString transaction_id = VARIANT_TO_CHARSTRING(p_options->get(\"transaction_id\"));\n\n    EOS_Ecom_CopyTransactionByIdOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ECOM_COPYTRANSACTIONBYID_API_LATEST;\n    options.LocalUserId = eosg_string_to_epic_account_id(local_user_id.get_data());\n    options.TransactionId = transaction_id.get_data();\n\n    EOS_Ecom_HTransaction outTransaction = nullptr;\n    EOS_EResult res = EOS_Ecom_CopyTransactionById(s_ecomInterface, &options, &outTransaction);\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"transaction\"] = eosg_ecom_transaction_to_wrapper(outTransaction);\n    return ret;\n}\n\nDictionary IEOS::ecom_interface_copy_transaction_by_index(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL_V(s_ecomInterface, {});\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    int transaction_index = p_options->get(\"transaction_index\");\n\n    EOS_Ecom_CopyTransactionByIndexOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ECOM_COPYTRANSACTIONBYINDEX_API_LATEST;\n    options.LocalUserId = eosg_string_to_epic_account_id(local_user_id.get_data());\n    options.TransactionIndex = static_cast<uint32_t>(transaction_index);\n\n    EOS_Ecom_HTransaction outTransaction = nullptr;\n    EOS_EResult res = EOS_Ecom_CopyTransactionByIndex(s_ecomInterface, &options, &outTransaction);\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"transaction\"] = eosg_ecom_transaction_to_wrapper(outTransaction);\n    return ret;\n}\n\nint IEOS::ecom_interface_get_entitlements_by_name_count(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL_V(s_ecomInterface, 0);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString entitlement_name = VARIANT_TO_CHARSTRING(p_options->get(\"entitlement_name\"));\n\n    EOS_Ecom_GetEntitlementsByNameCountOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ECOM_GETENTITLEMENTSBYNAMECOUNT_API_LATEST;\n    options.LocalUserId = eosg_string_to_epic_account_id(local_user_id.get_data());\n    options.EntitlementName = entitlement_name.get_data();\n\n    return static_cast<int>(EOS_Ecom_GetEntitlementsByNameCount(s_ecomInterface, &options));\n}\n\nint IEOS::ecom_interface_get_entitlements_count(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL_V(s_ecomInterface, 0);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n\n    EOS_Ecom_GetEntitlementsCountOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ECOM_GETENTITLEMENTSCOUNT_API_LATEST;\n    options.LocalUserId = eosg_string_to_epic_account_id(local_user_id.get_data());\n\n    return static_cast<int>(EOS_Ecom_GetEntitlementsCount(s_ecomInterface, &options));\n}\n\nint IEOS::ecom_interface_get_item_image_info_count(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL_V(s_ecomInterface, 0);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString item_id = VARIANT_TO_CHARSTRING(p_options->get(\"item_id\"));\n\n    EOS_Ecom_GetItemImageInfoCountOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ECOM_GETITEMIMAGEINFOCOUNT_API_LATEST;\n    options.LocalUserId = eosg_string_to_epic_account_id(local_user_id.get_data());\n    options.ItemId = item_id.get_data();\n\n    return static_cast<int>(EOS_Ecom_GetItemImageInfoCount(s_ecomInterface, &options));\n}\n\nint IEOS::ecom_interface_get_item_release_count(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL_V(s_ecomInterface, 0);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString item_id = VARIANT_TO_CHARSTRING(p_options->get(\"item_id\"));\n\n    EOS_Ecom_GetItemReleaseCountOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ECOM_GETITEMRELEASECOUNT_API_LATEST;\n    options.LocalUserId = eosg_string_to_epic_account_id(local_user_id.get_data());\n    options.ItemId = item_id.get_data();\n\n    return static_cast<int>(EOS_Ecom_GetItemReleaseCount(s_ecomInterface, &options));\n}\n\nint IEOS::ecom_interface_get_offer_count(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL_V(s_ecomInterface, 0);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n\n    EOS_Ecom_GetOfferCountOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ECOM_GETOFFERCOUNT_API_LATEST;\n    options.LocalUserId = eosg_string_to_epic_account_id(local_user_id.get_data());\n\n    return static_cast<int>(EOS_Ecom_GetOfferCount(s_ecomInterface, &options));\n}\n\nint IEOS::ecom_interface_get_offer_image_info_count(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL_V(s_ecomInterface, 0);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString offer_id = VARIANT_TO_CHARSTRING(p_options->get(\"offer_id\"));\n\n    EOS_Ecom_GetOfferImageInfoCountOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ECOM_GETOFFERIMAGEINFOCOUNT_API_LATEST;\n    options.LocalUserId = eosg_string_to_epic_account_id(local_user_id.get_data());\n    options.OfferId = offer_id.get_data();\n\n    return static_cast<int>(EOS_Ecom_GetOfferImageInfoCount(s_ecomInterface, &options));\n}\n\nint IEOS::ecom_interface_get_offer_item_count(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL_V(s_ecomInterface, 0);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString offer_id = VARIANT_TO_CHARSTRING(p_options->get(\"offer_id\"));\n\n    EOS_Ecom_GetOfferItemCountOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ECOM_GETOFFERITEMCOUNT_API_LATEST;\n    options.LocalUserId = eosg_string_to_epic_account_id(local_user_id.get_data());\n    options.OfferId = offer_id.get_data();\n\n    return static_cast<int>(EOS_Ecom_GetOfferItemCount(s_ecomInterface, &options));\n}\n\nint IEOS::ecom_interface_get_transaction_count(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL_V(s_ecomInterface, 0);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n\n    EOS_Ecom_GetTransactionCountOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ECOM_GETTRANSACTIONCOUNT_API_LATEST;\n    options.LocalUserId = eosg_string_to_epic_account_id(local_user_id.get_data());\n\n    return static_cast<int>(EOS_Ecom_GetTransactionCount(s_ecomInterface, &options));\n}\n\nvoid IEOS::ecom_interface_query_entitlements(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL(s_ecomInterface);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n\tCharString override_catalog_namespace = VARIANT_TO_CHARSTRING(p_options->get(\"override_catalog_namespace\"));\n\n    EOS_Ecom_QueryEntitlementsOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ECOM_QUERYENTITLEMENTS_API_LATEST;\n    options.LocalUserId = eosg_string_to_epic_account_id(local_user_id.get_data());\n\tif (override_catalog_namespace.size() > 0){\n\t\toptions.OverrideCatalogNamespace = override_catalog_namespace.get_data();\n\t}\n\n    TypedArray<String> p_entitlement_names = p_options->get(\"entitlement_names\");\n    options.EntitlementNameCount = static_cast<uint32_t>(p_entitlement_names.size());\n    EOS_Ecom_EntitlementName *entitlementNames = nullptr;\n    if (options.EntitlementNameCount > 0) {\n        entitlementNames = (EOS_Ecom_EntitlementName *)memalloc(sizeof(EOS_Ecom_EntitlementName) * p_entitlement_names.size());\n\n        for (int i = 0; i < options.EntitlementNameCount; i++) {\n            entitlementNames[i] = VARIANT_TO_CHARSTRING(p_entitlement_names[i]).get_data();\n        }\n    }\n    options.EntitlementNames = entitlementNames;\n    options.bIncludeRedeemed = VARIANT_TO_EOS_BOOL(p_options->get(\"include_redeemed\"));\n    p_options->reference();\n\n    EOS_Ecom_QueryEntitlements(s_ecomInterface, &options, (void *)*p_options, [](const EOS_Ecom_QueryEntitlementsCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"local_user_id\"] = eosg_epic_account_id_to_string(data->LocalUserId);\n        IEOS::get_singleton()->emit_signal(\"ecom_interface_query_entitlements_callback\", ret);\n    });\n}\n\nvoid IEOS::ecom_interface_query_offers(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL(s_ecomInterface);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString override_catalog_namespace = VARIANT_TO_CHARSTRING(p_options->get(\"override_catalog_namespace\"));\n\n    EOS_Ecom_QueryOffersOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ECOM_QUERYOFFERS_API_LATEST;\n    options.LocalUserId = eosg_string_to_epic_account_id(local_user_id.get_data());\n    if (override_catalog_namespace.length() > 0) {\n        options.OverrideCatalogNamespace = override_catalog_namespace.get_data();\n    }\n    p_options->reference();\n\n    EOS_Ecom_QueryOffers(s_ecomInterface, &options, (void *)*p_options, [](const EOS_Ecom_QueryOffersCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"local_user_id\"] = eosg_epic_account_id_to_string(data->LocalUserId);\n        IEOS::get_singleton()->emit_signal(\"ecom_interface_query_offers_callback\", ret);\n    });\n}\n\nvoid IEOS::ecom_interface_query_ownership(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL(s_ecomInterface);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString catalog_namespace = VARIANT_TO_CHARSTRING(p_options->get(\"catalog_namespace\"));\n\n    EOS_Ecom_QueryOwnershipOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ECOM_QUERYOWNERSHIP_API_LATEST;\n    options.LocalUserId = eosg_string_to_epic_account_id(local_user_id.get_data());\n    if (catalog_namespace.length() > 0) {\n        options.CatalogNamespace = catalog_namespace.get_data();\n    }\n\n    TypedArray<String> p_catalog_item_ids = p_options->get(\"catalog_item_ids\");\n    options.CatalogItemIdCount = static_cast<uint32_t>(p_catalog_item_ids.size());\n    EOS_Ecom_CatalogItemId *catalog_item_ids = nullptr;\n    if (options.CatalogItemIdCount > 0) {\n        catalog_item_ids = (EOS_Ecom_CatalogItemId *)memalloc(sizeof(EOS_Ecom_CatalogItemId) * p_catalog_item_ids.size());\n        for (int i = 0; i < options.CatalogItemIdCount; i++) {\n            catalog_item_ids[i] = VARIANT_TO_CHARSTRING(p_catalog_item_ids[i]).get_data();\n        }\n    }\n    options.CatalogItemIds = catalog_item_ids;\n\n    p_options->reference();\n\n    EOS_Ecom_QueryOwnership(s_ecomInterface, &options, (void *)*p_options, [](const EOS_Ecom_QueryOwnershipCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"local_user_id\"] = eosg_epic_account_id_to_string(data->LocalUserId);\n\n        Array item_ownership_array = Array();\n        for (int i = 0; i < data->ItemOwnershipCount; i++) {\n            Dictionary item_ownership;\n            item_ownership[\"id\"] = EOSG_GET_STRING(data->ItemOwnership[i].Id);\n            item_ownership[\"ownership_status\"] = static_cast<int>(data->ItemOwnership[i].OwnershipStatus);\n            item_ownership_array.append(item_ownership);\n        }\n        ret[\"item_ownership\"] = item_ownership_array;\n\n        IEOS::get_singleton()->emit_signal(\"ecom_interface_query_ownership_callback\", ret);\n    });\n}\n\nvoid IEOS::ecom_interface_query_ownership_token(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL(s_ecomInterface);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString catalog_namespace = VARIANT_TO_CHARSTRING(p_options->get(\"catalog_namespace\"));\n\n    TypedArray<String> p_catalog_item_ids = p_options->get(\"catalog_item_ids\");\n    EOS_Ecom_CatalogItemId *catalog_item_ids = nullptr;\n\n    EOS_Ecom_QueryOwnershipTokenOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ECOM_QUERYOWNERSHIPTOKEN_API_LATEST;\n    options.LocalUserId = eosg_string_to_epic_account_id(local_user_id.get_data());\n    if (catalog_namespace.length() > 0) {\n        options.CatalogNamespace = catalog_namespace.get_data();\n    }\n    options.CatalogItemIdCount = static_cast<uint32_t>(p_catalog_item_ids.size());\n    if (options.CatalogItemIdCount > 0) {\n        catalog_item_ids = (EOS_Ecom_CatalogItemId *)memalloc(sizeof(EOS_Ecom_CatalogItemId) * options.CatalogItemIdCount);\n        for (int i = 0; i < options.CatalogItemIdCount; i++) {\n            catalog_item_ids[i] = VARIANT_TO_CHARSTRING(p_catalog_item_ids[i]).get_data();\n        }\n    }\n    options.CatalogItemIds = catalog_item_ids;\n\n    p_options->reference();\n\n    EOS_Ecom_QueryOwnershipToken(s_ecomInterface, &options, (void *)*p_options, [](const EOS_Ecom_QueryOwnershipTokenCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"local_user_id\"] = eosg_epic_account_id_to_string(data->LocalUserId);\n        ret[\"ownership_token\"] = EOSG_GET_STRING(data->OwnershipToken);\n        IEOS::get_singleton()->emit_signal(\"ecom_interface_query_ownership_token_callback\", ret);\n    });\n}\n\nvoid IEOS::ecom_interface_redeem_entitlements(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL(s_ecomInterface);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    TypedArray<String> p_entitlement_ids = p_options->get(\"entitlement_ids\");\n\n    EOS_Ecom_EntitlementId *entitlement_ids = nullptr;\n\n    EOS_Ecom_RedeemEntitlementsOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ECOM_REDEEMENTITLEMENTS_API_LATEST;\n    options.LocalUserId = eosg_string_to_epic_account_id(local_user_id.get_data());\n    options.EntitlementIdCount = static_cast<uint32_t>(p_entitlement_ids.size());\n    if (options.EntitlementIdCount > 0) {\n        entitlement_ids = (EOS_Ecom_EntitlementId *)memalloc(sizeof(EOS_Ecom_EntitlementId) * p_entitlement_ids.size());\n        for (int i = 0; i < options.EntitlementIdCount; i++) {\n            entitlement_ids[i] = VARIANT_TO_CHARSTRING(p_entitlement_ids[i]).get_data();\n        }\n    }\n    options.EntitlementIds = entitlement_ids;\n    p_options->reference();\n\n    EOS_Ecom_RedeemEntitlements(s_ecomInterface, &options, (void *)*p_options, [](const EOS_Ecom_RedeemEntitlementsCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"local_user_id\"] = eosg_epic_account_id_to_string(data->LocalUserId);\n        ret[\"redeemed_entitlement_ids_count\"] = data->RedeemedEntitlementIdsCount;\n        IEOS::get_singleton()->emit_signal(\"ecom_interface_redeem_entitlements_callback\", ret);\n    });\n}\n\nint IEOS::ecom_interface_get_last_redeemed_entitlements_count(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL_V(s_ecomInterface, 0);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n\n    EOS_Ecom_GetLastRedeemedEntitlementsCountOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ECOM_GETLASTREDEEMEDENTITLEMENTSCOUNT_API_LATEST;\n    options.LocalUserId = eosg_string_to_epic_account_id(local_user_id.get_data());\n\n    return static_cast<int>(EOS_Ecom_GetLastRedeemedEntitlementsCount(s_ecomInterface, &options));\n}\n\nDictionary IEOS::ecom_interface_copy_last_redeemed_entitlement_by_index(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL_V(s_ecomInterface, {});\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n\n    EOS_Ecom_CopyLastRedeemedEntitlementByIndexOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ECOM_COPYLASTREDEEMEDENTITLEMENTBYINDEX_API_LATEST;\n    options.LocalUserId = eosg_string_to_epic_account_id(local_user_id.get_data());\n    options.RedeemedEntitlementIndex = static_cast<uint32_t>(p_options->get(\"redeemed_entitlement_index\"));\n\n    char *outEntitlementId = (char *)memalloc(EOS_ECOM_ENTITLEMENTID_MAX_LENGTH + 1);\n    int outEntitlementIdLength = EOS_ECOM_ENTITLEMENTID_MAX_LENGTH + 1;\n    EOS_EResult res = EOS_Ecom_CopyLastRedeemedEntitlementByIndex(s_ecomInterface, &options, outEntitlementId, &outEntitlementIdLength);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"entitlement_id\"] = EOSG_GET_STRING(outEntitlementId);\n    return ret;\n}\n\nvoid IEOS::ecom_interface_query_entitlement_token(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL(s_ecomInterface);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n\n    EOS_Ecom_QueryEntitlementTokenOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ECOM_QUERYENTITLEMENTTOKEN_API_LATEST;\n    options.LocalUserId = eosg_string_to_epic_account_id(local_user_id.get_data());\n\n    TypedArray<String> p_entitlement_names = p_options->get(\"entitlement_names\");\n    options.EntitlementNameCount = static_cast<uint32_t>(p_entitlement_names.size());\n    EOS_Ecom_EntitlementName *entitlementNames = nullptr;\n    if (options.EntitlementNameCount > 0) {\n        entitlementNames = (EOS_Ecom_EntitlementName *)memalloc(sizeof(EOS_Ecom_EntitlementName) * p_entitlement_names.size());\n\n        for (int i = 0; i < options.EntitlementNameCount; i++) {\n            entitlementNames[i] = VARIANT_TO_CHARSTRING(p_entitlement_names[i]).get_data();\n        }\n    }\n    options.EntitlementNames = entitlementNames;\n    p_options->reference();\n\n    EOS_Ecom_QueryEntitlementToken(s_ecomInterface, &options, (void *)*p_options, [](const EOS_Ecom_QueryEntitlementTokenCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"local_user_id\"] = eosg_epic_account_id_to_string(data->LocalUserId);\n        ret[\"entitlement_token\"] = EOSG_GET_STRING(data->EntitlementToken);\n        IEOS::get_singleton()->emit_signal(\"ecom_interface_query_entitlement_token_callback\", ret);\n    });\n}\n\nvoid IEOS::ecom_interface_query_ownership_by_sandbox_ids(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL(s_ecomInterface);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n\n    EOS_Ecom_QueryOwnershipBySandboxIdsOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ECOM_QUERYOWNERSHIPBYSANDBOXIDSOPTIONS_API_LATEST;\n    options.LocalUserId = eosg_string_to_epic_account_id(local_user_id.get_data());\n\n    TypedArray<String> p_sandbox_ids = p_options->get(\"sandbox_ids\");\n    options.SandboxIdsCount = static_cast<uint32_t>(p_sandbox_ids.size());\n    EOS_Ecom_SandboxId *sandbox_ids = nullptr;\n    if (options.SandboxIdsCount > 0) {\n        sandbox_ids = (EOS_Ecom_SandboxId *)memalloc(sizeof(EOS_Ecom_SandboxId) * p_sandbox_ids.size());\n        for (int i = 0; i < options.SandboxIdsCount; i++) {\n            sandbox_ids[i] = VARIANT_TO_CHARSTRING(p_sandbox_ids[i]).get_data();\n        }\n    }\n    options.SandboxIds = sandbox_ids;\n    p_options->reference();\n\n    EOS_Ecom_QueryOwnershipBySandboxIds(s_ecomInterface, &options, (void *)*p_options, [](const EOS_Ecom_QueryOwnershipBySandboxIdsCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"local_user_id\"] = eosg_epic_account_id_to_string(data->LocalUserId);\n\n        Array sandbox_id_item_ownership_array = Array();\n        for (int i = 0; i < data->SandboxIdItemOwnershipsCount; i++) {\n            Dictionary sandbox_id_item_ownership;\n            sandbox_id_item_ownership[\"sandbox_id\"] = EOSG_GET_STRING(data->SandboxIdItemOwnerships[i].SandboxId);\n\n            Array owned_catalog_item_ids_array = Array();\n            for (int j = 0; j < data->SandboxIdItemOwnerships[i].OwnedCatalogItemIdsCount; j++) {\n                owned_catalog_item_ids_array.append(EOSG_GET_STRING(data->SandboxIdItemOwnerships[i].OwnedCatalogItemIds[j]));\n            }\n            sandbox_id_item_ownership[\"owned_catalog_item_ids\"] = owned_catalog_item_ids_array;\n\n            sandbox_id_item_ownership_array.append(sandbox_id_item_ownership);\n        }\n        ret[\"sandbox_id_item_ownership\"] = sandbox_id_item_ownership_array;\n\n        IEOS::get_singleton()->emit_signal(\"ecom_interface_query_ownership_by_sandbox_ids_callback\", ret);\n    });\n}"
  },
  {
    "path": "src/eosg_active_session.cpp",
    "content": "#include \"eosg_active_session.h\"\n#include \"utils.h\"\n\nusing namespace godot;\n\nvoid EOSGActiveSession::_bind_methods() {\n    ClassDB::bind_method(D_METHOD(\"copy_info\"), &EOSGActiveSession::copy_info);\n    ClassDB::bind_method(D_METHOD(\"get_registered_player_count\"), &EOSGActiveSession::get_registered_player_count);\n    ClassDB::bind_method(D_METHOD(\"get_registered_player_by_index\", \"player_index\"), &EOSGActiveSession::get_registered_player_by_index);\n}\n\nDictionary EOSGActiveSession::copy_info() {\n    ERR_FAIL_NULL_V(m_internal, {});\n    EOS_ActiveSession_CopyInfoOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ACTIVESESSION_COPYINFO_API_LATEST;\n\n    EOS_ActiveSession_Info *outInfo = nullptr;\n    EOS_EResult res = EOS_ActiveSession_CopyInfo(m_internal, &options, &outInfo);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"info\"] = eosg_sessions_active_session_info_to_dict_and_release(outInfo);\n    return ret;\n}\n\nint EOSGActiveSession::get_registered_player_count() {\n    ERR_FAIL_NULL_V(m_internal, 0);\n    EOS_ActiveSession_GetRegisteredPlayerCountOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ACTIVESESSION_GETREGISTEREDPLAYERCOUNT_API_LATEST;\n\n    return static_cast<int>(EOS_ActiveSession_GetRegisteredPlayerCount(m_internal, &options));\n}\n\nString EOSGActiveSession::get_registered_player_by_index(int p_player_index) {\n    ERR_FAIL_NULL_V(m_internal, \"\");\n    EOS_ActiveSession_GetRegisteredPlayerByIndexOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ACTIVESESSION_GETREGISTEREDPLAYERBYINDEX_API_LATEST;\n    options.PlayerIndex = static_cast<uint32_t>(p_player_index);\n\n    EOS_ProductUserId userId = EOS_ActiveSession_GetRegisteredPlayerByIndex(m_internal, &options);\n    return eosg_product_user_id_to_string(userId);\n}"
  },
  {
    "path": "src/eosg_active_session.h",
    "content": "#pragma once\n#include \"eos_sessions.h\"\n#include \"godot_cpp/classes/ref_counted.hpp\"\n\nnamespace godot {\n\nclass EOSGActiveSession : public RefCounted {\n    GDCLASS(EOSGActiveSession, RefCounted)\n\nprivate:\n    EOS_HActiveSession m_internal = nullptr;\n    static void _bind_methods();\n\npublic:\n    Dictionary copy_info();\n    int get_registered_player_count();\n    String get_registered_player_by_index(int index);\n\n    EOSGActiveSession(){};\n    ~EOSGActiveSession() {\n        if (m_internal != nullptr) {\n            EOS_ActiveSession_Release(m_internal);\n\t\t\tm_internal = nullptr;\n        }\n    };\n\n    void set_internal(EOS_HActiveSession p_internal) {\n        m_internal = p_internal;\n    }\n\n    EOS_HActiveSession get_internal() {\n        return m_internal;\n    }\n};\n} // namespace godot\n"
  },
  {
    "path": "src/eosg_continuance_token.h",
    "content": "#pragma once\n#include \"eos_common.h\"\n#include \"godot_cpp/classes/ref_counted.hpp\"\n\nnamespace godot {\n\nclass EOSGContinuanceToken : public RefCounted {\n    GDCLASS(EOSGContinuanceToken, RefCounted)\n\nprivate:\n    EOS_ContinuanceToken m_internal = nullptr;\n    static void _bind_methods(){};\n\npublic:\n    EOSGContinuanceToken(){};\n    ~EOSGContinuanceToken(){};\n\n    void set_internal(EOS_ContinuanceToken p_internal) {\n        m_internal = p_internal;\n    }\n\n    EOS_ContinuanceToken get_internal() {\n        return m_internal;\n    }\n\n    String to_string() {\n        int32_t outBufferLength = 0;\n        EOS_ContinuanceToken_ToString(m_internal, nullptr, &outBufferLength);\n\n        // outBufferLength is set to required length\n        char *outBuffer = (char *)(memalloc(outBufferLength + 1));\n\n        EOS_EResult res = EOS_ContinuanceToken_ToString(m_internal, outBuffer, &outBufferLength);\n\n        if (res == EOS_EResult::EOS_Success) {\n            return String(\"ContinuanceToken[\") + String(outBuffer) + String(\"]\");\n        }\n\n        return \"ContinuanceToken[to_string failed]\";\n    }\n};\n} // namespace godot\n"
  },
  {
    "path": "src/eosg_file_transfer_request.h",
    "content": "#pragma once\n#include \"eosg_file_transfer_request.h\"\n#include \"godot_cpp/classes/ref_counted.hpp\"\n\nnamespace godot {\n\nclass EOSGFileTransferRequest : public RefCounted {\n    GDCLASS(EOSGFileTransferRequest, RefCounted)\n\nprivate:\n    static void _bind_methods() {\n        BIND_VIRTUAL_METHOD(EOSGFileTransferRequest, get_file_request_state);\n        BIND_VIRTUAL_METHOD(EOSGFileTransferRequest, get_filename);\n        BIND_VIRTUAL_METHOD(EOSGFileTransferRequest, cancel_request);\n    };\n\npublic:\n    // TODO: make these methods pure virtual\n    virtual int get_file_request_state() {\n        return -1;\n    }\n    virtual Dictionary get_filename() {\n        return Dictionary();\n    }\n    virtual int cancel_request() {\n        return -1;\n    }\n\n    EOSGFileTransferRequest(){};\n    ~EOSGFileTransferRequest(){};\n};\n} // namespace godot\n"
  },
  {
    "path": "src/eosg_lobby_details.cpp",
    "content": "#include \"eosg_lobby_details.h\"\n\n#include \"utils.h\"\n\nusing namespace godot;\n\nvoid EOSGLobbyDetails::_bind_methods() {\n    ClassDB::bind_method(D_METHOD(\"get_lobby_owner\"), &EOSGLobbyDetails::get_lobby_owner);\n    ClassDB::bind_method(D_METHOD(\"copy_info\"), &EOSGLobbyDetails::copy_info);\n    ClassDB::bind_method(D_METHOD(\"get_attribute_count\"), &EOSGLobbyDetails::get_attribute_count);\n    ClassDB::bind_method(D_METHOD(\"copy_attribute_by_index\", \"index\"), &EOSGLobbyDetails::copy_attribute_by_index);\n    ClassDB::bind_method(D_METHOD(\"copy_attribute_by_key\", \"key\"), &EOSGLobbyDetails::copy_attribute_by_key);\n    ClassDB::bind_method(D_METHOD(\"get_member_count\"), &EOSGLobbyDetails::get_member_count);\n    ClassDB::bind_method(D_METHOD(\"get_member_by_index\", \"index\"), &EOSGLobbyDetails::get_member_by_index);\n    ClassDB::bind_method(D_METHOD(\"get_member_attribute_count\", \"target_user_id\"), &EOSGLobbyDetails::get_member_attribute_count);\n    ClassDB::bind_method(D_METHOD(\"copy_member_info\", \"target_user_id\"), &EOSGLobbyDetails::copy_member_info);\n    ClassDB::bind_method(D_METHOD(\"copy_member_attribute_by_index\", \"target_user_id\", \"index\"), &EOSGLobbyDetails::copy_member_attribute_by_index);\n    ClassDB::bind_method(D_METHOD(\"copy_member_attribute_by_key\", \"target_user_id\", \"key\"), &EOSGLobbyDetails::copy_member_attribute_by_key);\n}\n\nString EOSGLobbyDetails::get_lobby_owner() {\n    ERR_FAIL_NULL_V(m_internal, \"\");\n    EOS_LobbyDetails_GetLobbyOwnerOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_LOBBYDETAILS_GETLOBBYOWNER_API_LATEST;\n    return eosg_product_user_id_to_string(EOS_LobbyDetails_GetLobbyOwner(m_internal, &options));\n}\n\nDictionary EOSGLobbyDetails::copy_info() {\n    ERR_FAIL_NULL_V(m_internal, {});\n    EOS_LobbyDetails_CopyInfoOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_LOBBYDETAILS_COPYINFO_API_LATEST;\n\n    EOS_LobbyDetails_Info *outLobbyDetails = nullptr;\n    EOS_EResult res = EOS_LobbyDetails_CopyInfo(m_internal, &options, &outLobbyDetails);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"lobby_details\"] = eosg_lobby_details_info_to_dict_and_release(outLobbyDetails);\n    return ret;\n}\n\nint EOSGLobbyDetails::get_attribute_count() {\n    ERR_FAIL_NULL_V(m_internal, 0);\n    EOS_LobbyDetails_GetAttributeCountOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_LOBBYDETAILS_GETATTRIBUTECOUNT_API_LATEST;\n    return static_cast<int>(EOS_LobbyDetails_GetAttributeCount(m_internal, &options));\n}\n\nDictionary EOSGLobbyDetails::copy_attribute_by_index(int p_index) {\n    ERR_FAIL_NULL_V(m_internal, {});\n    EOS_LobbyDetails_CopyAttributeByIndexOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_LOBBYDETAILS_COPYATTRIBUTEBYINDEX_API_LATEST;\n    options.AttrIndex = static_cast<uint32_t>(p_index);\n\n    EOS_Lobby_Attribute *outAttr = nullptr;\n    EOS_EResult res = EOS_LobbyDetails_CopyAttributeByIndex(m_internal, &options, &outAttr);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"attribute\"] = eosg_lobby_attribute_to_dict_and_release(outAttr);\n    return ret;\n}\n\nDictionary EOSGLobbyDetails::copy_attribute_by_key(const String &p_key) {\n    ERR_FAIL_NULL_V(m_internal, {});\n    CharString key = p_key.utf8();\n\n    EOS_LobbyDetails_CopyAttributeByKeyOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_LOBBYDETAILS_COPYATTRIBUTEBYKEY_API_LATEST;\n    options.AttrKey = key.get_data();\n\n    EOS_Lobby_Attribute *outAttr = nullptr;\n    EOS_EResult res = EOS_LobbyDetails_CopyAttributeByKey(m_internal, &options, &outAttr);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"attribute\"] = eosg_lobby_attribute_to_dict_and_release(outAttr);\n    return ret;\n}\n\nint EOSGLobbyDetails::get_member_count() {\n    ERR_FAIL_NULL_V(m_internal, 0);\n    EOS_LobbyDetails_GetMemberCountOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_LOBBYDETAILS_GETMEMBERCOUNT_API_LATEST;\n    return static_cast<int>(EOS_LobbyDetails_GetMemberCount(m_internal, &options));\n}\n\nString EOSGLobbyDetails::get_member_by_index(int p_index) {\n    ERR_FAIL_NULL_V(m_internal, \"\");\n    EOS_LobbyDetails_GetMemberByIndexOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_LOBBYDETAILS_GETMEMBERBYINDEX_API_LATEST;\n    options.MemberIndex = static_cast<uint32_t>(p_index);\n    return eosg_product_user_id_to_string(EOS_LobbyDetails_GetMemberByIndex(m_internal, &options));\n}\n\nint EOSGLobbyDetails::get_member_attribute_count(const String &p_target_user_id) {\n    ERR_FAIL_NULL_V(m_internal, 0);\n    CharString targetUserId = p_target_user_id.utf8();\n\n    EOS_LobbyDetails_GetMemberAttributeCountOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_LOBBYDETAILS_GETMEMBERATTRIBUTECOUNT_API_LATEST;\n    options.TargetUserId = eosg_string_to_product_user_id(targetUserId.get_data());\n\n    return static_cast<int>(EOS_LobbyDetails_GetMemberAttributeCount(m_internal, &options));\n}\n\nDictionary EOSGLobbyDetails::copy_member_attribute_by_index(const String &p_target_user_id, int p_index) {\n    ERR_FAIL_NULL_V(m_internal, {});\n    CharString targetUserId = p_target_user_id.utf8();\n\n    EOS_LobbyDetails_CopyMemberAttributeByIndexOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_LOBBYDETAILS_COPYMEMBERATTRIBUTEBYINDEX_API_LATEST;\n    options.TargetUserId = eosg_string_to_product_user_id(targetUserId.get_data());\n    options.AttrIndex = static_cast<uint32_t>(p_index);\n\n    EOS_Lobby_Attribute *outAttr = nullptr;\n    EOS_EResult res = EOS_LobbyDetails_CopyMemberAttributeByIndex(m_internal, &options, &outAttr);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"attribute\"] = eosg_lobby_attribute_to_dict_and_release(outAttr);\n    return ret;\n}\n\nDictionary EOSGLobbyDetails::copy_member_attribute_by_key(const String &p_target_user_id, const String &p_key) {\n    ERR_FAIL_NULL_V(m_internal, {});\n    CharString targetUserId = p_target_user_id.utf8();\n    CharString key = p_key.utf8();\n\n    EOS_LobbyDetails_CopyMemberAttributeByKeyOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_LOBBYDETAILS_COPYMEMBERATTRIBUTEBYKEY_API_LATEST;\n    options.TargetUserId = eosg_string_to_product_user_id(targetUserId.get_data());\n    options.AttrKey = key.get_data();\n\n    EOS_Lobby_Attribute *outAttr = nullptr;\n    EOS_EResult res = EOS_LobbyDetails_CopyMemberAttributeByKey(m_internal, &options, &outAttr);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"attribute\"] = eosg_lobby_attribute_to_dict_and_release(outAttr);\n    return ret;\n}\n\nDictionary EOSGLobbyDetails::copy_member_info(const String &p_target_user_id) {\n    ERR_FAIL_NULL_V(m_internal, {});\n    CharString targetUserId = p_target_user_id.utf8();\n\n    EOS_LobbyDetails_CopyMemberInfoOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_LOBBYDETAILS_COPYMEMBERINFO_API_LATEST;\n    options.TargetUserId = eosg_string_to_product_user_id(targetUserId.get_data());\n\n    EOS_LobbyDetails_MemberInfo *outMemberInfo = nullptr;\n    EOS_EResult res = EOS_LobbyDetails_CopyMemberInfo(m_internal, &options, &outMemberInfo);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"member_info\"] = eosg_lobby_details_member_info_to_dict_and_release(outMemberInfo);\n    return ret;\n}"
  },
  {
    "path": "src/eosg_lobby_details.h",
    "content": "#pragma once\n#include \"eos_lobby.h\"\n#include \"godot_cpp/classes/ref_counted.hpp\"\n#include \"godot_cpp/variant/dictionary.hpp\"\n\nnamespace godot {\n\nclass EOSGLobbyDetails : public RefCounted {\n    GDCLASS(EOSGLobbyDetails, RefCounted)\n\nprivate:\n    EOS_HLobbyDetails m_internal = nullptr;\n    static void _bind_methods();\n\npublic:\n    Dictionary copy_attribute_by_index(int index);\n    Dictionary copy_attribute_by_key(const String &key);\n    Dictionary copy_info();\n    Dictionary copy_member_attribute_by_index(const String &target_user_id, int index);\n    Dictionary copy_member_attribute_by_key(const String &target_user_id, const String &key);\n    Dictionary copy_member_info(const String &target_user_id);\n    int get_attribute_count();\n    int get_member_attribute_count(const String &target_user_id);\n    int get_member_count();\n    String get_lobby_owner();\n    String get_member_by_index(int index);\n\n    EOSGLobbyDetails(){};\n    ~EOSGLobbyDetails() {\n        if (m_internal != nullptr) {\n            EOS_LobbyDetails_Release(m_internal);\n\t\t\tm_internal = nullptr;\n        }\n    };\n\n    void set_internal(EOS_HLobbyDetails p_internal) {\n        m_internal = p_internal;\n    }\n\n    EOS_HLobbyDetails get_internal() {\n        return m_internal;\n    }\n};\n} // namespace godot\n"
  },
  {
    "path": "src/eosg_lobby_modification.cpp",
    "content": "#include \"eosg_lobby_modification.h\"\n\n#include \"utils.h\"\nusing namespace godot;\n\nvoid EOSGLobbyModification::_bind_methods() {\n    ClassDB::bind_method(D_METHOD(\"set_bucket_id\", \"bucket_id\"), &EOSGLobbyModification::set_bucket_id);\n    ClassDB::bind_method(D_METHOD(\"set_permission_level\", \"permission_level\"), &EOSGLobbyModification::set_permission_level);\n    ClassDB::bind_method(D_METHOD(\"set_max_members\", \"max_members\"), &EOSGLobbyModification::set_max_members);\n    ClassDB::bind_method(D_METHOD(\"set_invites_allowed\", \"invites_allowed\"), &EOSGLobbyModification::set_invites_allowed);\n    ClassDB::bind_method(D_METHOD(\"add_attribute\", \"key\", \"value\", \"visibility\"), &EOSGLobbyModification::add_attribute);\n    ClassDB::bind_method(D_METHOD(\"remove_attribute\", \"key\"), &EOSGLobbyModification::remove_attribute);\n    ClassDB::bind_method(D_METHOD(\"add_member_attribute\", \"key\", \"value\", \"visibility\"), &EOSGLobbyModification::add_member_attribute);\n    ClassDB::bind_method(D_METHOD(\"remove_member_attribute\", \"key\"), &EOSGLobbyModification::remove_member_attribute);\n\tClassDB::bind_method(D_METHOD(\"set_allowed_platform_ids\", \"allowed_platform_ids\"), &EOSGLobbyModification::set_allowed_platform_ids);\n}\n\nint EOSGLobbyModification::set_bucket_id(const String &p_bucket_id) {\n    ERR_FAIL_NULL_V(m_internal, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    CharString bucket_id = p_bucket_id.utf8();\n    EOS_LobbyModification_SetBucketIdOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_LOBBYMODIFICATION_SETBUCKETID_API_LATEST;\n    options.BucketId = bucket_id.get_data();\n\n    return static_cast<int>(EOS_LobbyModification_SetBucketId(m_internal, &options));\n}\n\nint EOSGLobbyModification::set_permission_level(int p_permission_level) {\n\tERR_FAIL_NULL_V(m_internal, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    EOS_LobbyModification_SetPermissionLevelOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_LOBBYMODIFICATION_SETPERMISSIONLEVEL_API_LATEST;\n    options.PermissionLevel = static_cast<EOS_ELobbyPermissionLevel>(p_permission_level);\n\n    return static_cast<int>(EOS_LobbyModification_SetPermissionLevel(m_internal, &options));\n}\n\nint EOSGLobbyModification::set_max_members(int p_max_members) {\n\tERR_FAIL_NULL_V(m_internal, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    EOS_LobbyModification_SetMaxMembersOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_LOBBYMODIFICATION_SETMAXMEMBERS_API_LATEST;\n    options.MaxMembers = static_cast<uint32_t>(p_max_members);\n\n    return static_cast<int>(EOS_LobbyModification_SetMaxMembers(m_internal, &options));\n}\n\nint EOSGLobbyModification::set_invites_allowed(bool p_invites_allowed) {\n\tERR_FAIL_NULL_V(m_internal, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    EOS_LobbyModification_SetInvitesAllowedOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_LOBBYMODIFICATION_SETINVITESALLOWED_API_LATEST;\n    options.bInvitesAllowed = p_invites_allowed ? EOS_TRUE : EOS_FALSE;\n\n    return static_cast<int>(EOS_LobbyModification_SetInvitesAllowed(m_internal, &options));\n}\n\nint EOSGLobbyModification::add_attribute(const String &p_key, Variant p_value, int p_visibility) {\n\tERR_FAIL_NULL_V(m_internal, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    CharString key = p_key.utf8();\n    CharString value;\n\n    EOS_Lobby_AttributeData attributeData;\n    memset(&attributeData, 0, sizeof(attributeData));\n    attributeData.ApiVersion = EOS_LOBBY_ATTRIBUTEDATA_API_LATEST;\n    attributeData.Key = key.get_data();\n\n    if (p_value.get_type() == Variant::Type::BOOL) {\n        attributeData.ValueType = EOS_ELobbyAttributeType::EOS_AT_BOOLEAN;\n        attributeData.Value.AsBool = p_value;\n    } else if (p_value.get_type() == Variant::Type::INT) {\n        attributeData.ValueType = EOS_ELobbyAttributeType::EOS_AT_INT64;\n        attributeData.Value.AsInt64 = p_value;\n    } else if (p_value.get_type() == Variant::Type::FLOAT) {\n        attributeData.ValueType = EOS_ELobbyAttributeType::EOS_AT_DOUBLE;\n        attributeData.Value.AsDouble = p_value;\n    } else if (p_value.get_type() == Variant::Type::STRING) {\n        value = VARIANT_TO_CHARSTRING(p_value);\n        attributeData.ValueType = EOS_ELobbyAttributeType::EOS_AT_STRING;\n        attributeData.Value.AsUtf8 = value.get_data();\n    }\n\n    EOS_LobbyModification_AddAttributeOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_LOBBYMODIFICATION_ADDATTRIBUTE_API_LATEST;\n    options.Attribute = &attributeData;\n    options.Visibility = static_cast<EOS_ELobbyAttributeVisibility>(p_visibility);\n\n    return static_cast<int>(EOS_LobbyModification_AddAttribute(m_internal, &options));\n}\n\nint EOSGLobbyModification::remove_attribute(const String &p_key) {\n\tERR_FAIL_NULL_V(m_internal, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    CharString key = p_key.utf8();\n\n    EOS_LobbyModification_RemoveAttributeOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_LOBBYMODIFICATION_REMOVEATTRIBUTE_API_LATEST;\n    options.Key = key.get_data();\n\n    return static_cast<int>(EOS_LobbyModification_RemoveAttribute(m_internal, &options));\n}\n\nint EOSGLobbyModification::add_member_attribute(const String &p_key, Variant p_value, int p_visibility) {\n\tERR_FAIL_NULL_V(m_internal, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    CharString key = p_key.utf8();\n\n    EOS_Lobby_AttributeData attributeData;\n    memset(&attributeData, 0, sizeof(attributeData));\n    attributeData.ApiVersion = EOS_LOBBY_ATTRIBUTEDATA_API_LATEST;\n    attributeData.Key = key.get_data();\n    CharString value;\n\n    if (p_value.get_type() == Variant::Type::BOOL) {\n        attributeData.ValueType = EOS_ELobbyAttributeType::EOS_AT_BOOLEAN;\n        attributeData.Value.AsBool = p_value;\n    } else if (p_value.get_type() == Variant::Type::INT) {\n        attributeData.ValueType = EOS_ELobbyAttributeType::EOS_AT_INT64;\n        attributeData.Value.AsInt64 = p_value;\n    } else if (p_value.get_type() == Variant::Type::FLOAT) {\n        attributeData.ValueType = EOS_ELobbyAttributeType::EOS_AT_DOUBLE;\n        attributeData.Value.AsDouble = p_value;\n    } else if (p_value.get_type() == Variant::Type::STRING) {\n        value = VARIANT_TO_CHARSTRING(p_value);\n        attributeData.ValueType = EOS_ELobbyAttributeType::EOS_AT_STRING;\n        attributeData.Value.AsUtf8 = value.get_data();\n    }\n\n    EOS_LobbyModification_AddMemberAttributeOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_LOBBYMODIFICATION_ADDMEMBERATTRIBUTE_API_LATEST;\n    options.Attribute = &attributeData;\n    options.Visibility = static_cast<EOS_ELobbyAttributeVisibility>(p_visibility);\n\n    return static_cast<int>(EOS_LobbyModification_AddMemberAttribute(m_internal, &options));\n}\n\nint EOSGLobbyModification::remove_member_attribute(const String &p_key) {\n\tERR_FAIL_NULL_V(m_internal, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    CharString key = p_key.utf8();\n\n    EOS_LobbyModification_RemoveMemberAttributeOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_LOBBYMODIFICATION_REMOVEMEMBERATTRIBUTE_API_LATEST;\n    options.Key = key.get_data();\n\n    return static_cast<int>(EOS_LobbyModification_RemoveMemberAttribute(m_internal, &options));\n}\n\nint EOSGLobbyModification::set_allowed_platform_ids(const TypedArray<int> &p_platform_ids) {\n\tERR_FAIL_NULL_V(m_internal, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    EOS_LobbyModification_SetAllowedPlatformIdsOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_LOBBYMODIFICATION_SETALLOWEDPLATFORMIDS_API_LATEST;\n    options.AllowedPlatformIdsCount = p_platform_ids.size();\n\n    uint32_t *platform_ids_array = (uint32_t *)memalloc(sizeof(uint32_t) * options.AllowedPlatformIdsCount);\n    for (int i = 0; i < options.AllowedPlatformIdsCount; i++) {\n        platform_ids_array[i] = static_cast<uint32_t>(p_platform_ids[i]);\n    }\n    options.AllowedPlatformIds = platform_ids_array;\n\n    int result = static_cast<int>(EOS_LobbyModification_SetAllowedPlatformIds(m_internal, &options));\n    memfree(platform_ids_array);\n    return result;\n}"
  },
  {
    "path": "src/eosg_lobby_modification.h",
    "content": "#pragma once\n#include \"eos_lobby.h\"\n#include \"godot_cpp/classes/ref_counted.hpp\"\n\nnamespace godot {\n\nclass EOSGLobbyModification : public RefCounted {\n    GDCLASS(EOSGLobbyModification, RefCounted)\n\nprivate:\n    EOS_HLobbyModification m_internal = nullptr;\n    static void _bind_methods();\n\npublic:\n    int add_attribute(const String &key, Variant value, int visibility);\n    int add_member_attribute(const String &key, Variant value, int visibility);\n    int remove_attribute(const String &key);\n    int remove_member_attribute(const String &key);\n    int set_allowed_platform_ids(const TypedArray<int> &platform_ids);\n    int set_bucket_id(const String &bucket_id);\n    int set_invites_allowed(bool invites_allowed);\n    int set_max_members(int max_members);\n    int set_permission_level(int permission_level);\n\n    EOSGLobbyModification(){};\n    ~EOSGLobbyModification() {\n        if (m_internal != nullptr) {\n            EOS_LobbyModification_Release(m_internal);\n\t\t\tm_internal = nullptr;\n        }\n    };\n\n    void set_internal(EOS_HLobbyModification p_internal) {\n        m_internal = p_internal;\n    }\n\n    EOS_HLobbyModification get_internal() {\n        return m_internal;\n    }\n};\n} // namespace godot\n"
  },
  {
    "path": "src/eosg_lobby_search.cpp",
    "content": "#include \"eosg_lobby_search.h\"\n\n#include \"utils.h\"\n\nusing namespace godot;\n\nvoid EOSGLobbySearch::_bind_methods() {\n    ClassDB::bind_method(D_METHOD(\"find\", \"local_user_id\"), &EOSGLobbySearch::find);\n    ClassDB::bind_method(D_METHOD(\"set_lobby_id\", \"lobby_id\"), &EOSGLobbySearch::set_lobby_id);\n    ClassDB::bind_method(D_METHOD(\"set_target_user_id\", \"target_user_id\"), &EOSGLobbySearch::set_target_user_id);\n    ClassDB::bind_method(D_METHOD(\"set_parameter\", \"key\", \"value\", \"comparison_op\"), &EOSGLobbySearch::set_parameter);\n    ClassDB::bind_method(D_METHOD(\"remove_parameter\", \"key\", \"comparison_op\"), &EOSGLobbySearch::remove_parameter);\n    ClassDB::bind_method(D_METHOD(\"set_max_results\", \"max_results\"), &EOSGLobbySearch::set_max_results);\n    ClassDB::bind_method(D_METHOD(\"get_search_result_count\"), &EOSGLobbySearch::get_search_result_count);\n    ClassDB::bind_method(D_METHOD(\"copy_search_result_by_index\", \"index\"), &EOSGLobbySearch::copy_search_result_by_index);\n}\n\nvoid EOSGLobbySearch::find(const String &p_local_user_id) {\n    ERR_FAIL_NULL(m_internal);\n    CharString local_user_id = p_local_user_id.utf8();\n    EOS_LobbySearch_FindOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_LOBBYSEARCH_FIND_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n\n    // TODO: Handle passing ClientData if needed\n    EOS_LobbySearch_Find(m_internal, &options, nullptr, [](const EOS_LobbySearch_FindCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        ret[\"client_data\"] = Variant();\n        IEOS::get_singleton()->emit_signal(\"lobby_search_find_callback\", ret);\n    });\n}\n\nint EOSGLobbySearch::set_lobby_id(const String &p_lobby_id) {\n    ERR_FAIL_NULL_V(m_internal, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    CharString lobby_id = p_lobby_id.utf8();\n    EOS_LobbySearch_SetLobbyIdOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_LOBBYSEARCH_SETLOBBYID_API_LATEST;\n    options.LobbyId = lobby_id.get_data();\n\n    return static_cast<int>(EOS_LobbySearch_SetLobbyId(m_internal, &options));\n}\n\nint EOSGLobbySearch::set_target_user_id(const String &p_target_user_id) {\n    ERR_FAIL_NULL_V(m_internal, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    CharString target_user_id = p_target_user_id.utf8();\n\n    EOS_LobbySearch_SetTargetUserIdOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_LOBBYSEARCH_SETTARGETUSERID_API_LATEST;\n    options.TargetUserId = eosg_string_to_product_user_id(target_user_id.get_data());\n\n    return static_cast<int>(EOS_LobbySearch_SetTargetUserId(m_internal, &options));\n}\n\nint EOSGLobbySearch::set_parameter(const String &p_key, Variant p_value, int p_comparison_op) {\n    ERR_FAIL_NULL_V(m_internal, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    CharString key = p_key.utf8();\n\n    EOS_Lobby_AttributeData attributeData;\n    memset(&attributeData, 0, sizeof(attributeData));\n    attributeData.ApiVersion = EOS_LOBBY_ATTRIBUTEDATA_API_LATEST;\n    attributeData.Key = key.get_data();\n    CharString value;\n\n    if (p_value.get_type() == Variant::Type::BOOL) {\n        attributeData.ValueType = EOS_ELobbyAttributeType::EOS_AT_BOOLEAN;\n        attributeData.Value.AsBool = p_value;\n    } else if (p_value.get_type() == Variant::Type::INT) {\n        attributeData.ValueType = EOS_ELobbyAttributeType::EOS_AT_INT64;\n        attributeData.Value.AsInt64 = p_value;\n    } else if (p_value.get_type() == Variant::Type::FLOAT) {\n        attributeData.ValueType = EOS_ELobbyAttributeType::EOS_AT_DOUBLE;\n        attributeData.Value.AsDouble = p_value;\n    } else if (p_value.get_type() == Variant::Type::STRING) {\n        value = VARIANT_TO_CHARSTRING(p_value);\n        attributeData.ValueType = EOS_ELobbyAttributeType::EOS_AT_STRING;\n        attributeData.Value.AsUtf8 = value.get_data();\n    }\n\n    EOS_LobbySearch_SetParameterOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_LOBBYSEARCH_SETPARAMETER_API_LATEST;\n    options.ComparisonOp = static_cast<EOS_EComparisonOp>(p_comparison_op);\n    options.Parameter = &attributeData;\n\n    return static_cast<int>(EOS_LobbySearch_SetParameter(m_internal, &options));\n}\n\nint EOSGLobbySearch::remove_parameter(const String &p_key, int p_comparison_op) {\n    ERR_FAIL_NULL_V(m_internal, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    CharString key = p_key.utf8();\n\n    EOS_LobbySearch_RemoveParameterOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_LOBBYSEARCH_REMOVEPARAMETER_API_LATEST;\n    options.Key = key.get_data();\n    options.ComparisonOp = static_cast<EOS_EComparisonOp>(p_comparison_op);\n\n    return static_cast<int>(EOS_LobbySearch_RemoveParameter(m_internal, &options));\n}\n\nint EOSGLobbySearch::set_max_results(int p_max_results) {\n    ERR_FAIL_NULL_V(m_internal, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    EOS_LobbySearch_SetMaxResultsOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_LOBBYSEARCH_SETMAXRESULTS_API_LATEST;\n    options.MaxResults = static_cast<uint32_t>(p_max_results);\n\n    return static_cast<int>(EOS_LobbySearch_SetMaxResults(m_internal, &options));\n}\n\nint EOSGLobbySearch::get_search_result_count() {\n    ERR_FAIL_NULL_V(m_internal, 0);\n    EOS_LobbySearch_GetSearchResultCountOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_LOBBYSEARCH_GETSEARCHRESULTCOUNT_API_LATEST;\n\n    return static_cast<int>(EOS_LobbySearch_GetSearchResultCount(m_internal, &options));\n}\n\nDictionary EOSGLobbySearch::copy_search_result_by_index(int p_index) {\n    ERR_FAIL_NULL_V(m_internal, {});\n    EOS_LobbySearch_CopySearchResultByIndexOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_LOBBYSEARCH_COPYSEARCHRESULTBYINDEX_API_LATEST;\n    options.LobbyIndex = static_cast<uint32_t>(p_index);\n\n    EOS_HLobbyDetails outLobbyDetails = nullptr;\n    EOS_EResult res = EOS_LobbySearch_CopySearchResultByIndex(m_internal, &options, &outLobbyDetails);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"lobby_details\"] = eosg_lobby_lobby_details_to_wrapper(outLobbyDetails);\n    return ret;\n}\n"
  },
  {
    "path": "src/eosg_lobby_search.h",
    "content": "#pragma once\n#include \"eos_lobby.h\"\n#include \"godot_cpp/classes/ref_counted.hpp\"\n\nnamespace godot {\n\nclass EOSGLobbySearch : public RefCounted {\n    GDCLASS(EOSGLobbySearch, RefCounted)\n\nprivate:\n    EOS_HLobbySearch m_internal = nullptr;\n    static void _bind_methods();\n\npublic:\n    Dictionary copy_search_result_by_index(int index);\n    int get_search_result_count();\n    int remove_parameter(const String &key, int comparison_op);\n    int set_lobby_id(const String &lobby_id);\n    int set_max_results(int max_results);\n    int set_parameter(const String &key, Variant value, int comparison_op);\n    int set_target_user_id(const String &target_user_id);\n    void find(const String &local_user_id);\n\n    EOSGLobbySearch(){};\n    ~EOSGLobbySearch() {\n        if (m_internal != nullptr) {\n            EOS_LobbySearch_Release(m_internal);\n\t\t\tm_internal = nullptr;\n        }\n    };\n\n    void set_internal(EOS_HLobbySearch p_internal) {\n        m_internal = p_internal;\n    }\n\n    EOS_HLobbySearch get_internal() {\n        return m_internal;\n    }\n};\n} // namespace godot\n"
  },
  {
    "path": "src/eosg_multiplayer_peer.cpp",
    "content": "/****************************************\n * EOSGMultiplayerPeer\n * Author: Dallin Lovin aka LowFire\n * Description: Multiplayer peer that uses the EOS P2P Interface to allow users to\n * establish direct peer-to-peer connections with other players over the internet.\n * NAT punchthrough is handled automatically by the P2P interface and a relay server\n * is used if direct connection is not possible. EOSGMultiplayerPeer allows users to\n * create either a client, server, or mesh instance. A server opens a socket and actively listens\n * for incoming connection requests. When a connection request is received, a server can either\n * accept or reject the connection request. Servers auto accept connection requests by default.\n * Clients can only connect to a server instance and cannot accept connection requests\n * from anyone. Clients are only allowed to be connected to a single peer and that peer\n * must be a server. Mesh instances can arbitrarily connect to each other using a common\n * socket id. They can also connect to a server instance. The socket id must be the same on\n * all mesh instances if they are to connect to each other. Once connected, mesh instances can\n * send packets to each other just like a server and clients, but those packets will not be relayed. A mesh instance can only send\n * packets to peers they are directly connected to.\n ****************************************/\n\n#include \"eosg_multiplayer_peer.h\"\n#include \"eosg_packet_peer_mediator.h\"\n#include \"ieos.h\"\n\nusing namespace godot;\n\nEOS_ProductUserId EOSGMultiplayerPeer::s_local_user_id = nullptr;\n\nvoid EOSGMultiplayerPeer::_bind_methods() {\n    ClassDB::bind_static_method(\"EOSGMultiplayerPeer\", D_METHOD(\"get_local_user_id\"), &EOSGMultiplayerPeer::get_local_user_id);\n\n    ClassDB::bind_method(D_METHOD(\"create_server\", \"socket_id\"), &EOSGMultiplayerPeer::create_server);\n    ClassDB::bind_method(D_METHOD(\"create_client\", \"socket_id\", \"remote_user_id\"), &EOSGMultiplayerPeer::create_client);\n    ClassDB::bind_method(D_METHOD(\"create_mesh\", \"socket_id\"), &EOSGMultiplayerPeer::create_mesh);\n    ClassDB::bind_method(D_METHOD(\"add_mesh_peer\", \"remote_user_id\"), &EOSGMultiplayerPeer::add_mesh_peer);\n    ClassDB::bind_method(D_METHOD(\"get_socket\"), &EOSGMultiplayerPeer::get_socket);\n    ClassDB::bind_method(D_METHOD(\"get_peer_id\", \"remote_user_id\"), &EOSGMultiplayerPeer::get_peer_id);\n    ClassDB::bind_method(D_METHOD(\"set_allow_delayed_delivery\", \"allow\"), &EOSGMultiplayerPeer::set_allow_delayed_delivery);\n    ClassDB::bind_method(D_METHOD(\"is_allowing_delayed_delivery\"), &EOSGMultiplayerPeer::is_allowing_delayed_delivery);\n    ClassDB::bind_method(D_METHOD(\"is_auto_accepting_connection_requests\"), &EOSGMultiplayerPeer::is_auto_accepting_connection_requests);\n    ClassDB::bind_method(D_METHOD(\"set_auto_accept_connection_requests\", \"enable\"), &EOSGMultiplayerPeer::set_auto_accept_connection_requests);\n    ClassDB::bind_method(D_METHOD(\"get_all_connection_requests\"), &EOSGMultiplayerPeer::get_all_connection_requests);\n    ClassDB::bind_method(D_METHOD(\"has_peer\", \"peer_id\"), &EOSGMultiplayerPeer::has_peer);\n    ClassDB::bind_method(D_METHOD(\"has_user_id\", \"remote_user_id\"), &EOSGMultiplayerPeer::has_user_id);\n    ClassDB::bind_method(D_METHOD(\"accept_connection_request\", \"remote_user_id\"), &EOSGMultiplayerPeer::accept_connection_request);\n    ClassDB::bind_method(D_METHOD(\"deny_connection_request\", \"remote_user_id\"), &EOSGMultiplayerPeer::deny_connection_request);\n    ClassDB::bind_method(D_METHOD(\"accept_all_connection_requests\"), &EOSGMultiplayerPeer::accept_all_connection_requests);\n    ClassDB::bind_method(D_METHOD(\"deny_all_connection_requests\"), &EOSGMultiplayerPeer::deny_all_connection_requests);\n    ClassDB::bind_method(D_METHOD(\"get_active_mode\"), &EOSGMultiplayerPeer::get_active_mode);\n    ClassDB::bind_method(D_METHOD(\"get_all_peers\"), &EOSGMultiplayerPeer::get_all_peers);\n    ClassDB::bind_method(D_METHOD(\"get_peer_user_id\", \"peer_id\"), &EOSGMultiplayerPeer::get_peer_user_id);\n    ClassDB::bind_method(D_METHOD(\"is_polling\"), &EOSGMultiplayerPeer::is_polling);\n    ClassDB::bind_method(D_METHOD(\"set_is_polling\", \"polling\"), &EOSGMultiplayerPeer::set_is_polling);\n\n    ADD_SIGNAL(MethodInfo(\"peer_connection_established\", PropertyInfo(Variant::DICTIONARY, \"callback_data\")));\n    ADD_SIGNAL(MethodInfo(\"peer_connection_interrupted\", PropertyInfo(Variant::DICTIONARY, \"callback_data\")));\n    ADD_SIGNAL(MethodInfo(\"peer_connection_closed\", PropertyInfo(Variant::DICTIONARY, \"callback_data\")));\n    ADD_SIGNAL(MethodInfo(\"incoming_connection_request\", PropertyInfo(Variant::DICTIONARY, \"callback_data\")));\n}\n\n/****************************************\n * create_server\n * Parameters:\n *   socket_id - The socket id the server uses to listen for connection requests.\n * Description: Creates a server instance using the given socket id.\n ****************************************/\nError EOSGMultiplayerPeer::create_server(const String &socket_id) {\n    ERR_FAIL_NULL_V_MSG(s_local_user_id, ERR_UNCONFIGURED, \"Failed to create server. Local user id has not been set.\");\n    ERR_FAIL_COND_V_MSG(_is_active(), ERR_ALREADY_IN_USE, \"Failed to create server. Multiplayer instance is already active.\");\n\n    unique_id = 1;\n    active_mode = MODE_SERVER;\n    connection_status = CONNECTION_CONNECTED;\n    polling = true;\n    set_refuse_new_connections(false);\n\n    //Create a socket where we will be listening for connections\n    socket = EOSGSocket(socket_id);\n    if (socket.get_name().is_empty()) {\n        _close();\n        ERR_FAIL_V_MSG(ERR_CANT_CREATE, \"Failed to create server.\");\n    }\n\n    bool success = EOSGPacketPeerMediator::get_singleton()->register_peer(this);\n\n    if (!success) {\n        _close();\n        ERR_FAIL_V_MSG(ERR_CANT_CREATE, \"Failed to create server.\");\n    }\n\n    return OK;\n}\n\n/****************************************\n * create_client\n * Parameters:\n *   socket_id - The socket id of the server the client is trying to connect to.\n *   remote_user_id - The user id of the server the client is trying to connect to.\n * Description: Creates a client instance and sends a connection request to the server using\n * the socket id and remote user id. Clients are only allowed to connect to servers. If the\n * remote user is another client or a mesh instance, connection will fail.\n ****************************************/\nError EOSGMultiplayerPeer::create_client(const String &socket_id, const String &remote_user_id) {\n    ERR_FAIL_NULL_V_MSG(s_local_user_id, ERR_UNCONFIGURED, \"Failed to create client. Local user id has not been set.\");\n    ERR_FAIL_COND_V_MSG(_is_active(), ERR_ALREADY_IN_USE, \"Failed to create client. Multiplayer instance is already active.\");\n\n    polling = true;\n    set_refuse_new_connections(false);\n\n    //Create the socket we are trying to connect to\n    socket = EOSGSocket(socket_id);\n    if (socket.get_name().is_empty()) {\n        _close();\n        ERR_FAIL_V_MSG(ERR_CANT_CREATE, \"Failed to create client.\");\n    }\n\n    bool success = EOSGPacketPeerMediator::get_singleton()->register_peer(this);\n\n    if (!success) {\n        _close();\n        ERR_FAIL_V_MSG(ERR_CANT_CREATE, \"Failed to create client.\");\n    }\n\n    unique_id = generate_unique_id();\n    active_mode = MODE_CLIENT;\n    connection_status = CONNECTION_CONNECTING;\n\n    //send connection request to server\n    EOSGPacket packet;\n    packet.set_event(EVENT_RECIEVE_PEER_ID);\n    packet.set_channel(CH_RELIABLE);\n    packet.set_reliability(EOS_EPacketReliability::EOS_PR_ReliableUnordered);\n    packet.set_sender(unique_id);\n    packet.prepare();\n\n    //send peer id to the server\n    Error result = _send_to(eosg_string_to_product_user_id(remote_user_id.utf8()), packet);\n\n    if (result != OK) {\n        _close();\n        return result;\n    }\n    return OK;\n}\n\n/****************************************\n * create_mesh\n * Parameters:\n *   socket_id - The socket id the mesh instance uses to listen for connection requests.\n * Description: Creates a mesh instance using the given socket id. Other mesh instances can send\n * connection requests to this instance using the socket id.\n ****************************************/\nError EOSGMultiplayerPeer::create_mesh(const String &socket_id) {\n    ERR_FAIL_NULL_V_MSG(s_local_user_id, ERR_UNCONFIGURED, \"Failed to create mesh. Local user id has not been set.\");\n    ERR_FAIL_COND_V_MSG(_is_active(), ERR_ALREADY_IN_USE, \"Failed to create mesh. Multiplayer instance is already active.\");\n\n    unique_id = generate_unique_id();\n    active_mode = MODE_MESH;\n    connection_status = CONNECTION_CONNECTED;\n    polling = true;\n\n    //Create a socket where we will be listening for connections\n    socket = EOSGSocket(socket_id);\n    if (socket.get_name().is_empty()) {\n        _close();\n        ERR_FAIL_V_MSG(ERR_CANT_CREATE, \"Failed to create mesh.\");\n    }\n\n    bool success = EOSGPacketPeerMediator::get_singleton()->register_peer(this);\n\n    if (!success) {\n        _close();\n        ERR_FAIL_V_MSG(ERR_CANT_CREATE, \"Failed to create mesh.\");\n    }\n\n    return OK;\n}\n\n/****************************************\n * add_mesh_peer\n * Parameters:\n *   remote_user_id - The remote user id of the other mesh instance this mesh instance is trying to\n * connect to.\n * Description: Sends a connection request to another mesh instance using the remote user id. If the connection\n * request is accepted, the other instance is added as a peer.\n ****************************************/\nError EOSGMultiplayerPeer::add_mesh_peer(const String &remote_user_id) {\n    ERR_FAIL_NULL_V_MSG(s_local_user_id, ERR_UNCONFIGURED, \"Failed to add mesh peer. Local user id has not been set.\");\n    ERR_FAIL_COND_V_MSG(active_mode != MODE_MESH, ERR_UNCONFIGURED, \"Failed to add mesh peer. Multiplayer instance is not in mesh mode.\");\n    ERR_FAIL_COND_V_MSG(has_user_id(remote_user_id), ERR_ALREADY_EXISTS, \"Failed to add mesh peer. Already connected to peer\");\n\n    //send connection request to peer\n    EOSGPacket packet;\n    packet.set_event(EVENT_MESH_CONNECTION_REQUEST);\n    packet.set_channel(CH_RELIABLE);\n    packet.set_reliability(EOS_EPacketReliability::EOS_PR_ReliableUnordered);\n    packet.set_sender(unique_id);\n    packet.prepare();\n\n    _send_to(eosg_string_to_product_user_id(remote_user_id.utf8()), packet);\n\n    return OK;\n}\n\n/****************************************\n * get_socket\n * Description: Returns the socket id of this multiplayer instance.\n ****************************************/\nString EOSGMultiplayerPeer::get_socket() const {\n    return socket.get_name();\n}\n\n/****************************************\n * get_all_connection_requests\n * Description: Returns all connection requests currently pending. Returns an empty\n * array if there are none.\n ****************************************/\nArray EOSGMultiplayerPeer::get_all_connection_requests() {\n    Array ret = Array();\n    for (const EOS_ProductUserId &remote_user : pending_connection_requests) {\n        ret.push_back(eosg_product_user_id_to_string(remote_user));\n    }\n    return ret;\n}\n\n/****************************************\n * get_peer_user_id\n * Parameters:\n *   p_id - The peer id of the peer to return the user id of.\n * Description: Returns the remote user id of the given peer. Returns an empty string\n * if the peer could not be found.\n ****************************************/\nString EOSGMultiplayerPeer::get_peer_user_id(int p_id) {\n    String ret = \"\";\n    if (!peers.has(p_id)) {\n        return ret;\n    }\n    EOS_ProductUserId user_id = peers.get(p_id);\n    ret = eosg_product_user_id_to_string(user_id);\n    return ret;\n}\n\n/****************************************\n * get_peer_id\n * Parameters:\n *   remote_user_id - The remote user id used to find a peer.\n * Description: Retrieves the peer id of a peer using their remote user id. Returns 0\n * if no peer with a matching remote user id could be found.\n ****************************************/\nint EOSGMultiplayerPeer::get_peer_id(const String &remote_user_id) {\n    for (KeyValue<uint32_t, EOS_ProductUserId> &E : peers) {\n        EOS_ProductUserId user_id = E.value;\n        String user_id_str = eosg_product_user_id_to_string(user_id);\n        if (remote_user_id == user_id_str) {\n            return E.key;\n        }\n    }\n    return 0;\n}\n\n/****************************************\n * get_peer_id\n * Parameters:\n *   peer_id - The peer id of the peer to find.\n * Description: Returns whether or not this multiplayer instance has the given\n * peer.\n ****************************************/\nbool EOSGMultiplayerPeer::has_peer(int peer_id) {\n    return peers.has(peer_id);\n}\n\n/****************************************\n * has_user_id\n * Parameters:\n *   remote_user_id - The remote user id to look for.\n * Description: Returns whether or not this multiplayer instance has a peer with the given\n * remote user id.\n ****************************************/\nbool EOSGMultiplayerPeer::has_user_id(const String &remote_user_id) {\n    for (KeyValue<uint32_t, EOS_ProductUserId> &E : peers) {\n        String peer_user_id = eosg_product_user_id_to_string(E.value);\n        if (remote_user_id != peer_user_id)\n            continue;\n        return true;\n    }\n    return false;\n}\n\n/****************************************\n * _clear_peer_packet_queue\n * Parameters:\n *   peer_id - The peer id of the peer to clear the packet from.\n * Description: Clears all packets sent by the given peer.\n ****************************************/\nvoid EOSGMultiplayerPeer::_clear_peer_packet_queue(int p_id) {\n    ERR_FAIL_COND_MSG(!peers.has(p_id), \"Failed to clear packet queue for peer. Peer was not found.\");\n\n    socket.clear_packets_from_peer(p_id);\n    String remote_user_id = eosg_product_user_id_to_string(peers[p_id]);\n    EOSGPacketPeerMediator::get_singleton()->clear_packets_from_remote_user(socket.get_name(), remote_user_id);\n}\n\n/****************************************\n * get_all_peers\n * Description: Gets all connected peers. Returns a dictionary, using the peer id as key\n * and the peer's remote user id as value.\n ****************************************/\nDictionary EOSGMultiplayerPeer::get_all_peers() {\n    Dictionary ret;\n    for (KeyValue<uint32_t, EOS_ProductUserId> &E : peers) {\n        EOS_ProductUserId user_id = E.value;\n        ret[E.key] = eosg_product_user_id_to_string(user_id);\n    }\n    return ret;\n}\n\n/****************************************\n * set_allowed_delayed_delivery\n * Parameters:\n *   allow - bool used to set allowed delivery.\n * Description: Set whether or not delayed delivery should be allowed on all sent packets.\n * This means that packets will be delayed in their delivery if a connenetion with the other\n * peer has not been estalished yet, otherwise the packets will be dropped.\n ****************************************/\nvoid EOSGMultiplayerPeer::set_allow_delayed_delivery(bool allow) {\n    allow_delayed_delivery = allow;\n}\n\n/****************************************\n * is_allowing_delayed_delivery\n * Description: Returns whether or not delayed deliver is turned on.\n ****************************************/\nbool EOSGMultiplayerPeer::is_allowing_delayed_delivery() {\n    return allow_delayed_delivery;\n}\n\n/****************************************\n * set_auto_accept_connection_requests\n * Parameters:\n *   enable - bool used to set auto accept connection requests.\n * Description: Set whether or not to auto accept connection requests when they are\n * recieved. If this is off, connection requests are put into a list to be accepted\n * or denied later if desired.\n ****************************************/\nvoid EOSGMultiplayerPeer::set_auto_accept_connection_requests(bool enable) {\n    auto_accept_connection_requests = enable;\n}\n\n/****************************************\n * is_auto_accepting_connection_requests\n * Description: Returns whether or not auto accepting connection requests is on.\n ****************************************/\nbool EOSGMultiplayerPeer::is_auto_accepting_connection_requests() {\n    return auto_accept_connection_requests;\n}\n\n/****************************************\n * accept_connection_request\n * Parameters:\n *   remote_user - The remote user id of the peer to accept a connection request from.\n * Description: Accepts a connection request from the given peer. If the connection request is accepted,\n * the peer will establish a connection with this multiplayer instance and peer id's will be exchanged.\n * The method does nothing if no connection request could be found using the given remote user id.\n ****************************************/\nvoid EOSGMultiplayerPeer::accept_connection_request(const String &remote_user) {\n    ERR_FAIL_COND_MSG(active_mode == MODE_NONE, \"Cannot accept connection requests when multiplayer instance is not active.\");\n    ERR_FAIL_COND_MSG(active_mode == MODE_CLIENT, \"Clients are not allowed to accept connection requests.\");\n    ERR_FAIL_NULL_MSG(s_local_user_id, \"Cannot accept connection requests. Local user id has not been set.\");\n\n    EOS_ProductUserId remote_user_id;\n    if (!_find_connection_request(remote_user, remote_user_id))\n        return;\n\n    EOS_P2P_AcceptConnectionOptions options;\n    options.ApiVersion = EOS_P2P_ACCEPTCONNECTION_API_LATEST;\n    options.LocalUserId = s_local_user_id;\n    options.RemoteUserId = remote_user_id;\n    options.SocketId = socket.get_id();\n    EOS_EResult result = IEOS::get_singleton()->_p2p_accept_connection(&options);\n\n    ERR_FAIL_COND_MSG(result == EOS_EResult::EOS_InvalidParameters, \"Failed to accept connection request! Invalid parameters.\");\n\n    pending_connection_requests.erase(remote_user_id);\n}\n\n/****************************************\n * deny_connection_request\n * Parameters:\n *   remote_user - The remote user id of the peer to deny a connection request from.\n * Description: Denies a connection request from the given peer. The connection request is removed\n * from the list of pending connection requests when denied and the connection is closed with the peer.\n ****************************************/\nvoid EOSGMultiplayerPeer::deny_connection_request(const String &remote_user) {\n    ERR_FAIL_NULL_MSG(s_local_user_id, \"Failed to deny connection request. Local user id not set\");\n    if (active_mode == MODE_NONE || active_mode == MODE_CLIENT)\n        return;\n    EOS_ProductUserId remote_user_id;\n    if (!_find_connection_request(remote_user, remote_user_id))\n        return;\n\n    EOS_P2P_CloseConnectionOptions options;\n    options.ApiVersion = EOS_P2P_CLOSECONNECTION_API_LATEST;\n    options.LocalUserId = s_local_user_id;\n    options.RemoteUserId = remote_user_id;\n    options.SocketId = socket.get_id();\n    EOS_EResult result = IEOS::get_singleton()->_p2p_close_connection(&options);\n\n    ERR_FAIL_COND_MSG(result == EOS_EResult::EOS_InvalidParameters, \"Failed to deny connection. Invalid parameters.\");\n\n    pending_connection_requests.erase(remote_user_id);\n}\n\n/****************************************\n * accept_all_connection_requests\n * Description: Accepts all connection requests currently pending.\n ****************************************/\nvoid EOSGMultiplayerPeer::accept_all_connection_requests() {\n    if (pending_connection_requests.size() == 0)\n        return;\n\n    ERR_FAIL_COND_MSG(active_mode == MODE_NONE, \"Cannot accept connection requests when multiplayer instance is not active.\");\n    ERR_FAIL_COND_MSG(active_mode == MODE_CLIENT, \"Clients are not allowed to accept connection requests.\");\n    ERR_FAIL_NULL_MSG(s_local_user_id, \"Cannot accept connection requests. Local user id has not been set.\");\n\n    for (const EOS_ProductUserId &remote_user_id : pending_connection_requests) {\n        String remote_user_id_str = eosg_product_user_id_to_string(remote_user_id);\n        accept_connection_request(remote_user_id_str);\n    }\n}\n\n/****************************************\n * deny_all_connection_requests\n * Description: Denies all connection requests currently pending.\n ****************************************/\nvoid EOSGMultiplayerPeer::deny_all_connection_requests() {\n    ERR_FAIL_NULL_MSG(s_local_user_id, \"Failed to deny connection requests. Local user id not set\");\n    if (active_mode == MODE_NONE || active_mode == MODE_CLIENT)\n        return;\n\n    for (const EOS_ProductUserId &remote_user_id : pending_connection_requests) {\n        String remote_user_id_str = eosg_product_user_id_to_string(remote_user_id);\n        deny_connection_request(remote_user_id_str);\n    }\n\n    pending_connection_requests.clear();\n}\n\n/****************************************\n * get_active_mode\n * Description: Returns the active mode of the multiplayer peer, which could be either be MODE_CLIENT,\n * MODE_SERVER, MODE_MESH, or MODE_NONE. MODE_NONE is returned if the multiplayer instance is not\n * currently active.\n ****************************************/\nint EOSGMultiplayerPeer::get_active_mode() {\n    return static_cast<int>(active_mode);\n}\n\n/****************************************\n * _get_packet\n *   Parameters:\n *   r_buffer - out parameter that returns packet's raw byte data.\n *   r_buffer_size - out parameter that returns the packet's total size in bytes.\n * Description: This method is called by the MultiplayerAPI when it tries to poll the next available packet\n * from this multiplayer instance. The packet data and the packet size is returned to the MultiplayerAPI using\n * the r_buffer and r_buffer_size out parameters.\n ****************************************/\nError EOSGMultiplayerPeer::_get_packet(const uint8_t **r_buffer, int32_t *r_buffer_size) {\n    current_packet = socket.pop_packet();\n\n    *r_buffer = current_packet.get_payload();\n    *r_buffer_size = current_packet.payload_size();\n\n    return OK;\n}\n\n/****************************************\n * _put_packet\n *   Parameters:\n *   r_buffer - The packet's raw byte data being sent by the MultiplayerAPI\n *   r_buffer_size - The size in bytes of the packet being sent.\n * Description: This method is called by the MultiplayerAPI when it tries to send a packet to\n * a connected peer. The packet's event type, transfer mode, and sender's peer id are put into\n * a packet header before sending. The payload, which is the data being sent by the MultiplayerAPI,\n * is appended after the packet header. Once the packet has been prepared, it is sent to the intended\n * peer.\n ****************************************/\nError EOSGMultiplayerPeer::_put_packet(const uint8_t *p_buffer, int32_t p_buffer_size) {\n    ERR_FAIL_NULL_V_MSG(s_local_user_id, ERR_UNCONFIGURED, \"Local user id has not been set.\");\n    ERR_FAIL_COND_V_MSG(!_is_active(), ERR_UNCONFIGURED, \"The multiplayer instance isn't currently active.\");\n    ERR_FAIL_COND_V_MSG(connection_status != CONNECTION_CONNECTED, ERR_UNCONFIGURED, \"The multiplayer instance isn't currently connected\");\n    ERR_FAIL_COND_V_MSG(target_peer != 0 && !peers.has(ABS(target_peer)), ERR_INVALID_PARAMETER, vformat(\"Invalid target peer: %d\", target_peer));\n    ERR_FAIL_COND_V_MSG(p_buffer_size > _get_max_packet_size(), ERR_UNAVAILABLE, \"Failed to send packet. Packet size exceeds limits.\");\n    ERR_FAIL_COND_V(active_mode == MODE_CLIENT && !peers.has(1), ERR_BUG);\n\n    uint8_t channel;\n    uint8_t tr_channel = _get_transfer_channel();\n    channel = CH_RELIABLE;\n    EOS_EPacketReliability reliability = EOS_EPacketReliability::EOS_PR_UnreliableUnordered;\n\n    /*IMPORTANT NOTE: EOS does not support an unreliable ordered transfer mode,\n    so it has been left out. EOSGMultiplayerPeer prints a warning and automatically sets the transfer\n    mode to TRANSFER_MODE_RELIABLE if the user tries to set to unreliable ordred.\n    See _set_transer_mode()*/\n    switch (_get_transfer_mode()) {\n        case TRANSFER_MODE_UNRELIABLE: {\n            reliability = EOS_EPacketReliability::EOS_PR_UnreliableUnordered;\n            channel = CH_UNRELIABLE;\n        } break;\n        case TRANSFER_MODE_RELIABLE: {\n            reliability = EOS_EPacketReliability::EOS_PR_ReliableOrdered;\n            channel = CH_RELIABLE;\n        } break;\n        case TRANSFER_MODE_UNRELIABLE_ORDERED: {\n        } break;\n    }\n    if (tr_channel > 0) {\n        channel = CH_MAX + tr_channel - 1;\n    }\n\n    EOSGPacket packet;\n    packet.set_sender(unique_id);\n    packet.set_reliability(reliability);\n    packet.set_channel(channel);\n    packet.set_event(EVENT_STORE_PACKET);\n    packet.store_payload(p_buffer, p_buffer_size);\n    packet.prepare();\n\n    Error result;\n    if (_is_server() || active_mode == MODE_MESH) {\n        if (target_peer == 0) {\n            result = _broadcast(packet);\n        } else if (target_peer < 0) {\n            int exclude = ABS(target_peer);\n            result = _broadcast(packet, exclude);\n        } else {\n            result = _send_to(peers[target_peer], packet);\n        }\n    } else { //We're a client\n        result = _send_to(peers[1], packet); //send to the server\n    }\n    return result;\n}\n\n/****************************************\n * _get_available_packet_count\n * Description: Called by MultiplayerAPI to query how\n * many packets are currently queued. The MultiplayerAPI calls this method\n * every time it polls to determine if there are packets to recieve.\n ****************************************/\nint32_t EOSGMultiplayerPeer::_get_available_packet_count() const {\n    return socket.get_packet_count();\n}\n\n/****************************************\n * _get_max_packet_size\n * Description: Called by MultiplayerAPI to query how\n * large packets are allowed to be.\n ****************************************/\nint32_t EOSGMultiplayerPeer::_get_max_packet_size() const {\n    return EOS_P2P_MAX_PACKET_SIZE;\n}\n\n/****************************************\n * _get_packet_channel\n * Description: Called by MultiplayerAPI to get the channel of next\n * avaialble packet in the packet queue.\n ****************************************/\nint32_t EOSGMultiplayerPeer::_get_packet_channel() const {\n    return socket.get_packet_channel();\n}\n\n/****************************************\n * _get_packet_mode\n * Description: Called by MultiplayerAPI to get the transfer mode of next\n * avaialble packet in the packet queue.\n ****************************************/\nMultiplayerPeer::TransferMode EOSGMultiplayerPeer::_get_packet_mode() const {\n    return _convert_eos_reliability_to_transfer_mode(socket.get_packet_reliability());\n}\n\n/****************************************\n * _set_transfer_channel\n * Parameters:\n *   p_channel - The channel to set to.\n * Description: Called by MultiplayerAPI to set the transfer channel of this\n * multiplayer instance.\n ****************************************/\nvoid EOSGMultiplayerPeer::_set_transfer_channel(int32_t p_channel) {\n    transfer_channel = p_channel;\n}\n\n/****************************************\n * _get_transfer_channel\n * Description: Called by MultiplayerAPI to get the transfer channel of\n * this multiplayer instance.\n ****************************************/\nint32_t EOSGMultiplayerPeer::_get_transfer_channel() const {\n    return transfer_channel;\n}\n\n/****************************************\n * _set_transfer_mode\n * Parameters:\n *   p_mode - The transfer mode to set to.\n * Description: Called by MultiplayerAPI to set the transfer mode of\n * this multiplayer instance. Unreliable ordered is not supported so the transfer mode\n * is set to reliable in that case.\n ****************************************/\nvoid EOSGMultiplayerPeer::_set_transfer_mode(MultiplayerPeer::TransferMode p_mode) {\n    if (p_mode == TRANSFER_MODE_UNRELIABLE_ORDERED) {\n        WARN_PRINT(\"EOSGMultiplayerPeer does not support unreliable ordered. Setting to reliable instead.\");\n        transfer_mode = TRANSFER_MODE_RELIABLE;\n        return;\n    }\n    transfer_mode = p_mode;\n}\n\n/****************************************\n * _get_transfer_mode\n * Description: Called by MultiplayerAPI to get the transfer mode of\n * this multiplayer instance.\n ****************************************/\nMultiplayerPeer::TransferMode EOSGMultiplayerPeer::_get_transfer_mode() const {\n    return transfer_mode;\n}\n\n/****************************************\n * _set_target_peer\n * Parameters:\n *   p_peer - The target peer\n * Description: Called by MultiplayerAPI to set the target peer to\n * send packets to. If this is set to 0, packets are broadcasted to all connected to peers.\n * If the value is negative, packets are broadcasted to all peers except for the peer identified\n * by the absolute value of the negative id.\n ****************************************/\nvoid EOSGMultiplayerPeer::_set_target_peer(int32_t p_peer) {\n    target_peer = p_peer;\n}\n\n/****************************************\n * _get_packet_peer\n * Description: Called by MultiplayerAPI to get the peer id of the peer\n * who sent the next queued packet.\n ****************************************/\nint32_t EOSGMultiplayerPeer::_get_packet_peer() const {\n    return socket.get_packet_peer();\n}\n\n/****************************************\n * _is_server\n * Description: Called by MultiplayerAPI to determine if this instance is a server.\n ****************************************/\nbool EOSGMultiplayerPeer::_is_server() const {\n    return active_mode == MODE_SERVER;\n}\n\n/****************************************\n * _poll\n * Description: Called by MultiplayerAPI every network frame to poll queued packets inside EOSGPacketPeerMediator.\n * Packets are recieved first from EOSGPacketPeerMediator. Once polled, the event type of each packet\n * are retrieved from the first byte of the packet. If the event type is EVENT_RECIEVED_PEER_ID,\n * the sender peer id contained inside the packet header is added to the list of connected peers\n * for this mutliplayer instance. This usually happens only once when peers first establish a connection.\n * If the event is EVENT_STORE_PACKET, the packet is queued into the socket's packet queue to be\n * retrieved by the MultiplayerAPI later (See _get_packet()). If the event is EVENT_MESH_CONNECTION_REQUEST,\n * then do nothing. This event is just to notify the multiplayer instance that the packet has been used to\n * establish a connection between two mesh instances and nothing needs to be done with the packet.\n ****************************************/\nvoid EOSGMultiplayerPeer::_poll() {\n    ERR_FAIL_COND_MSG(!_is_active(), \"The multiplayer instance isn't currently active.\");\n    if (!polling && !EOSGPacketPeerMediator::get_singleton()->next_packet_is_peer_id_packet(socket.get_name()))\n        return;\n    if (EOSGPacketPeerMediator::get_singleton()->get_packet_count_for_socket(socket.get_name()) == 0)\n        return; //No packets available\n\n    List<PacketData> packets;\n    PacketData next_packet;\n    if (!polling) { //The next packet should be a peer id packet if we're at this point\n        while (EOSGPacketPeerMediator::get_singleton()->next_packet_is_peer_id_packet(socket.get_name())) {\n            EOSGPacketPeerMediator::get_singleton()->poll_next_packet(socket.get_name(), &next_packet);\n            packets.push_back(next_packet);\n        }\n    } else {\n        while (EOSGPacketPeerMediator::get_singleton()->poll_next_packet(socket.get_name(), &next_packet)) {\n            packets.push_back(next_packet);\n        }\n    }\n\n    //process all the packets\n    for (PacketData &packet_data : packets) {\n        PackedByteArray *data_ptr = packet_data.get_data();\n        Event event = static_cast<Event>(data_ptr->ptrw()[INDEX_EVENT_TYPE]);\n        switch (event) {\n            case Event::EVENT_STORE_PACKET: {\n                uint32_t peer_id = *reinterpret_cast<uint32_t *>(data_ptr->ptrw() + INDEX_PEER_ID);\n                if (!peers.has(peer_id)) {\n                    return; //ignore the packet if we don't have the peer\n                }\n\n                EOS_EPacketReliability reliability = static_cast<EOS_EPacketReliability>(data_ptr->ptrw()[INDEX_TRANSFER_MODE]);\n\n                EOSGPacket packet;\n                packet.store_payload(data_ptr->ptrw() + INDEX_PAYLOAD_DATA, packet_data.size() - EOSGPacket::PACKET_HEADER_SIZE);\n                packet.set_event(event);\n                packet.set_sender(peer_id);\n                packet.set_reliability(reliability);\n                packet.set_channel(packet_data.get_channel());\n\n                socket.push_packet(packet);\n                break;\n            }\n            case Event::EVENT_RECIEVE_PEER_ID: {\n                ERR_FAIL_COND_MSG(active_mode == MODE_CLIENT && connection_status == CONNECTION_CONNECTED, \"Client has recieved a EVENT_RECIEVE_PEER_ID packet when already connected. This shouldn't have happened!\");\n\n                uint32_t peer_id = *reinterpret_cast<uint32_t *>(data_ptr->ptrw() + INDEX_PEER_ID);\n                if (active_mode == MODE_CLIENT && peer_id != 1) {\n                    _close();\n                    ERR_FAIL_MSG(\"Failed to connect. Instance is not a server.\");\n                }\n\n                EOS_ProductUserId remote_user = eosg_string_to_product_user_id(packet_data.get_sender().utf8());\n                if (peer_id < 1 || peers.has(peer_id) || unique_id == peer_id) {\n                    _disconnect_remote_user(remote_user); //Invalid peer id. reject the peer.\n                    break;\n                }\n\n                if (has_user_id(packet_data.get_sender())) {\n                    //Peer may have reconnected with a new multiplayer instance. Remove their old peer id.\n                    int old_id = get_peer_id(packet_data.get_sender());\n                    peers.erase(old_id);\n                    emit_signal(\"peer_disconnected\", old_id);\n                }\n\n                peers.insert(peer_id, remote_user);\n                if (active_mode == MODE_CLIENT) {\n                    connection_status = CONNECTION_CONNECTED;\n                }\n\n                emit_signal(\"peer_connected\", peer_id);\n                break;\n            }\n            case Event::EVENT_MESH_CONNECTION_REQUEST:\n                break;\n        }\n    }\n}\n\n/****************************************\n * _close\n * Description: Called when the multiplayer instance closes. Cleans everything up, closes connections with all peers,\n * and resets the state of the multiplayer instance.\n ****************************************/\nvoid EOSGMultiplayerPeer::_close() {\n    if (!_is_active()) {\n        return;\n    }\n\n    polling = false; //To prevent any further packets from coming in when we close the socket.\n    socket.close();\n    active_mode = MODE_NONE;\n    connection_status = CONNECTION_DISCONNECTED;\n    pending_connection_requests.clear();\n    unique_id = 0;\n    set_refuse_new_connections(false);\n\n    if (peers.is_empty()) { //Go ahead and unregister if there were no peers connected\n        EOSGPacketPeerMediator::get_singleton()->unregister_peer(this);\n    }\n}\n\n/****************************************\n * _disconnect_peer\n * Parameters:\n *   p_peer - The peer to disconnect\n *   p_force - Whether or not we should force disconnection with the peer.\n * Description: Disconnects the given peer. The peer is removed from the list of connected peers\n * when the connection closed. If p_force is set to true, the peer is removed from the list immediately\n * instead of waiting for a confirmed disconnection.\n ****************************************/\nvoid EOSGMultiplayerPeer::_disconnect_peer(int32_t p_peer, bool p_force) {\n    ERR_FAIL_COND(!_is_active() || !peers.has(p_peer));\n    ERR_FAIL_NULL_MSG(s_local_user_id, \"Cannot close connection. Local user id is not set\");\n\n    EOS_ProductUserId user_id = peers.get(p_peer);\n    _disconnect_remote_user(user_id);\n\n    if (p_force && peers.has(p_peer)) {\n        peers.erase(p_peer);\n        emit_signal(\"peer_disconnected\", p_peer);\n    }\n}\n\n/****************************************\n * _get_unique_id\n * Description: returns the peer id of this multiplayer instance.\n ****************************************/\nint32_t EOSGMultiplayerPeer::_get_unique_id() const {\n    return unique_id;\n}\n\n/****************************************\n * _set_refuse_new_connections\n * Parameters:\n *   p_enable - bool that sets refusing new connections.\n * Description: Sets whether or not new connections are refused. Setting this to true means\n * that all connection requests are automatically denied. This overrides auto accepting connection requests.\n ****************************************/\nvoid EOSGMultiplayerPeer::_set_refuse_new_connections(bool p_enable) {\n    refusing_connections = p_enable;\n}\n\n/****************************************\n * _is_refuse_new_connections\n * Description: Returns whether or not new connections are refused.\n ****************************************/\nbool EOSGMultiplayerPeer::_is_refusing_new_connections() const {\n    return refusing_connections;\n}\n\n/****************************************\n * _is_server_relayed_supported\n * Description: Called by MultiplayerAPI to determine if if this multiplayer instance\n * supports packet relaying. If the instance is either a server or a connected client, then\n * relaying is supported. This is not the case for mesh instances.\n ****************************************/\nbool EOSGMultiplayerPeer::_is_server_relay_supported() const {\n    return active_mode == MODE_SERVER || active_mode == MODE_CLIENT;\n}\n\n/****************************************\n * _get_connection_status\n * Description: Returns the connection status of this multiplayer instance. Can be either\n * CONNECTION_DISCONNECTED, CONNECTION_CONNECTING, or CONNECTION_CONNECTED.\n ****************************************/\nMultiplayerPeer::ConnectionStatus EOSGMultiplayerPeer::_get_connection_status() const {\n    return connection_status;\n}\n\n/****************************************\n * set_local_user_id\n * Description: Static method that sets the local user id for the game. This is called when\n * players first log into the connect interface. This needs to be done for the multiplayer instance\n * to work.\n ****************************************/\nvoid EOSGMultiplayerPeer::set_local_user_id(const String &p_local_user_id) {\n    CharString local_user_id = p_local_user_id.utf8();\n    s_local_user_id = eosg_string_to_product_user_id(local_user_id);\n}\n\n/****************************************\n * get_local_user_id\n * Description: Returns the currently set local user id. Returns an empty string if it was not set.\n ****************************************/\nString EOSGMultiplayerPeer::get_local_user_id() {\n    if (s_local_user_id == nullptr)\n        return \"\";\n    String local_user_id = eosg_product_user_id_to_string(s_local_user_id);\n    return local_user_id;\n}\n\n/****************************************\n * _broadcast\n * Parameters:\n *   packet - The packet to be broadcasted.\n *   exclude - The peer that is excluded from receiving the packet.\n * Description: Broadcast the given packet to all connected peers, except for the peer given by the\n * exclude parameter.\n ****************************************/\nError EOSGMultiplayerPeer::_broadcast(const EOSGPacket &packet, int exclude) {\n    ERR_FAIL_COND_V_MSG(packet.packet_size() > _get_max_packet_size(), ERR_OUT_OF_MEMORY, \"Failed to send packet. Packet exceeds max size limits.\");\n\n    EOS_P2P_SendPacketOptions options;\n    options.ApiVersion = EOS_P2P_SENDPACKET_API_LATEST;\n    options.LocalUserId = s_local_user_id;\n    options.Channel = packet.get_channel();\n    options.DataLengthBytes = packet.packet_size();\n    options.Data = packet.get_packet();\n    options.bAllowDelayedDelivery = allow_delayed_delivery;\n    options.Reliability = packet.get_reliability();\n    options.bDisableAutoAcceptConnection = EOS_FALSE;\n    options.SocketId = socket.get_id();\n\n    for (KeyValue<uint32_t, EOS_ProductUserId> &E : peers) {\n        if (E.key == exclude) {\n            continue;\n        }\n\n        options.RemoteUserId = E.value;\n        EOS_EResult result = IEOS::get_singleton()->_p2p_send_packet(&options);\n\n        ERR_FAIL_COND_V_MSG(result == EOS_EResult::EOS_InvalidParameters, ERR_INVALID_PARAMETER, \"Failed to send packet! Invalid parameters.\");\n        ERR_FAIL_COND_V_MSG(result == EOS_EResult::EOS_LimitExceeded, FAILED, \"Failed to send packet! Packet is either too large or outgoing packet queue is full.\");\n        ERR_FAIL_COND_V_MSG(result == EOS_EResult::EOS_NoConnection, ERR_CANT_CONNECT, \"Failed to send packet! No connection.\");\n    }\n\n    return OK;\n}\n\n/****************************************\n * _send_to\n * Parameters:\n *   remote_peer - The peer to send the packet to.\n *   packet - The packet being sent.\n * Description: Sends a packet to the given peer identified by the product user id.\n ****************************************/\nError EOSGMultiplayerPeer::_send_to(const EOS_ProductUserId &remote_peer, const EOSGPacket &packet) {\n    ERR_FAIL_COND_V_MSG(packet.packet_size() > _get_max_packet_size(), ERR_OUT_OF_MEMORY, \"Failed to send packet. Packet exceeds max size limits.\");\n\n    EOS_P2P_SendPacketOptions options;\n    options.ApiVersion = EOS_P2P_SENDPACKET_API_LATEST;\n    options.LocalUserId = s_local_user_id;\n    options.RemoteUserId = remote_peer;\n    options.SocketId = socket.get_id();\n    options.Channel = packet.get_channel();\n    options.DataLengthBytes = packet.packet_size();\n    options.Data = packet.get_packet();\n    options.bAllowDelayedDelivery = allow_delayed_delivery;\n    options.Reliability = packet.get_reliability();\n    options.bDisableAutoAcceptConnection = EOS_FALSE;\n\n    EOS_EResult result = IEOS::get_singleton()->_p2p_send_packet(&options);\n\n    ERR_FAIL_COND_V_MSG(result == EOS_EResult::EOS_InvalidParameters, ERR_INVALID_PARAMETER, \"Failed to send packet! Invalid parameters.\");\n    ERR_FAIL_COND_V_MSG(result == EOS_EResult::EOS_LimitExceeded, FAILED, \"Failed to send packet! Packet is either too large or outgoing packet queue is full.\");\n    ERR_FAIL_COND_V_MSG(result == EOS_EResult::EOS_NoConnection, ERR_CANT_CONNECT, \"Failed to send packet! No connection.\");\n\n    return OK;\n}\n\n/****************************************\n * _find_connection_request\n * Parameters:\n *   remote_user - The user to look for a connection request.\n *   out_request - An out parameter that returns the found connection request.\n * Description: Looks for a connection request in the pending connection request list for the given remote user.\n * Method returns true if a connection request was found for the user. False otherwise.\n ****************************************/\nbool EOSGMultiplayerPeer::_find_connection_request(const String &remote_user, EOS_ProductUserId &out_request) {\n    for (const EOS_ProductUserId &remote_user_id : pending_connection_requests) {\n        String remote_user_id_str = eosg_product_user_id_to_string(remote_user_id);\n        if (remote_user == remote_user_id_str) {\n            out_request = remote_user_id;\n            return true;\n        }\n    }\n    return false;\n}\n\n/****************************************\n * _convert_transfer_mode_to_eos_reliability\n * Parameters:\n *   mode - The transfer mode to convert.\n * Description: A helper function that converts the given transfer mode to matching packet reliability.\n * If TRANSFER_MODE_UNRELIABLE_ORDED is passed, the function returns EOS_PR_ReliableOrdered because EOS\n * does not support unreliable ordered\n ****************************************/\nEOS_EPacketReliability EOSGMultiplayerPeer::_convert_transfer_mode_to_eos_reliability(TransferMode mode) const {\n    switch (mode) {\n        case TRANSFER_MODE_UNRELIABLE:\n            return EOS_EPacketReliability::EOS_PR_UnreliableUnordered;\n        case TRANSFER_MODE_UNRELIABLE_ORDERED:\n            return EOS_EPacketReliability::EOS_PR_ReliableOrdered;\n        case TRANSFER_MODE_RELIABLE:\n            return EOS_EPacketReliability::EOS_PR_ReliableOrdered;\n        default:\n            return EOS_EPacketReliability::EOS_PR_UnreliableUnordered;\n    }\n}\n\n/****************************************\n * _convert_eos_reliability_to_transfer_mode\n * Parameters:\n *   reliability - The packet reliability to convert.\n * Description: A helper function that converts the given packet reliability to a matching transfer mode.\n ****************************************/\nMultiplayerPeer::TransferMode EOSGMultiplayerPeer::_convert_eos_reliability_to_transfer_mode(EOS_EPacketReliability reliability) const {\n    switch (reliability) {\n        case EOS_EPacketReliability::EOS_PR_UnreliableUnordered:\n            return TRANSFER_MODE_UNRELIABLE;\n        case EOS_EPacketReliability::EOS_PR_ReliableOrdered:\n            return TRANSFER_MODE_RELIABLE;\n        default:\n            return TRANSFER_MODE_UNRELIABLE;\n    }\n}\n\n/****************************************\n * _disconnect_remote_user\n * Parameters:\n *   remote_user - The remote user id of the user to close the connection.\n * Description: Closes the connection with the given remote user. This is done on the EOS side\n * and is called right before the peer with the remote user id is removed from the multiplayer\n * instance (see _disconnect_peer()).\n ****************************************/\nvoid EOSGMultiplayerPeer::_disconnect_remote_user(const EOS_ProductUserId &remote_user) {\n    EOS_P2P_CloseConnectionOptions options;\n    options.ApiVersion = EOS_P2P_CLOSECONNECTION_API_LATEST;\n    options.LocalUserId = s_local_user_id;\n    options.RemoteUserId = remote_user;\n    options.SocketId = socket.get_id();\n    EOS_EResult result = IEOS::get_singleton()->_p2p_close_connection(&options);\n\n    ERR_FAIL_COND_MSG(result == EOS_EResult::EOS_InvalidParameters, \"Failed to close peer connection. Invalid parameters.\");\n}\n\n/****************************************\n * _peer_connection_established_callback\n * Parameters:\n *   data - data retrieved from the connection established callback.\n * Description: A callback that is called by EOSGPacketPeerMediator when it receives a peer connection\n * established notification. The data contains the local user id of this instance, the remote user id of\n * peer who just connected, the socket id that the remote peer connected to, the connection type (which tells\n * you whether it was a new connection or a re-connection), and the network type (which tells you if it is a direct\n * connection or a relay server is being used.) When a connection is established for the first time and the instance\n * is not a client, a packet will be sent back to the newly connected peer with the EVENT_RECIEVE_PEER_ID event.\n * This is how servers and mesh instances peers exchange their peer ids with newly connected peers.\n ****************************************/\nvoid EOSGMultiplayerPeer::peer_connection_established_callback(const EOS_P2P_OnPeerConnectionEstablishedInfo *data) {\n    if (data->ConnectionType == EOS_EConnectionEstablishedType::EOS_CET_NewConnection &&\n            active_mode != MODE_CLIENT) { //We're either a server or mesh\n        //Send peer id to connected peer\n        EOSGPacket packet;\n        packet.set_event(EVENT_RECIEVE_PEER_ID);\n        packet.set_channel(CH_RELIABLE);\n        packet.set_reliability(EOS_EPacketReliability::EOS_PR_ReliableUnordered);\n        packet.set_sender(unique_id);\n        packet.prepare();\n\n        Error result = _send_to(data->RemoteUserId, packet);\n    }\n\n    String local_user_id_str = eosg_product_user_id_to_string(data->LocalUserId);\n    String remote_user_id_str = eosg_product_user_id_to_string(data->RemoteUserId);\n    int connection_type = static_cast<int>(data->ConnectionType);\n    int network_type = static_cast<int>(data->NetworkType);\n\n    Dictionary ret;\n    ret[\"local_user_id\"] = local_user_id_str;\n    ret[\"remote_user_id\"] = remote_user_id_str;\n    ret[\"socket\"] = data->SocketId->SocketName;\n    ret[\"connection_type\"] = connection_type;\n    ret[\"network_type\"] = network_type;\n    emit_signal(\"peer_connection_established\", ret);\n}\n\n/****************************************\n * remote_connection_closed_callback\n * Parameters:\n *   data - data retrieved from the connection closed callback.\n * Description: A callback that is called by EOSGPacketPeerMediator when it receives a remote connection\n * closed notification. The data contains the local user id of this instance, the remote user id of\n * peer whose connection has closed, the socket id that the remote peer was previously connected to,\n * and the reason for the disconnection (Which could be a LOT of different reasons, like timeouts, failed\n * connections, remotely disconnected, etc.). When a connection is closed, the instance checks if there\n * was a connection request associated with the connection. If there was, then remove the connection request\n * from the pending connection requests. If the peer was already previously connected, remove the peer\n * from the instance. If this instance is a client when the callback is called it either means the client\n * has disconnected locally or connection with the server has failed.\n ****************************************/\nvoid EOSGMultiplayerPeer::remote_connection_closed_callback(const EOS_P2P_OnRemoteConnectionClosedInfo *data) {\n    String local_user_id_str = eosg_product_user_id_to_string(data->LocalUserId);\n    String remote_user_id_str = eosg_product_user_id_to_string(data->RemoteUserId);\n    int reason = static_cast<int>(data->Reason);\n\n    //attempt to remove connection request if there was one.\n    EOS_ProductUserId remote_user_id;\n    if (_find_connection_request(remote_user_id_str, remote_user_id)) {\n        pending_connection_requests.erase(remote_user_id);\n    }\n\n    //Attempt to remove peer;\n    int peer_id = get_peer_id(remote_user_id_str);\n    if (peer_id != 0) {\n        _clear_peer_packet_queue(peer_id);\n        peers.erase(peer_id);\n        emit_signal(\"peer_disconnected\", peer_id);\n    }\n\n    //If this callback is called when we're a client and the reason isn't due to the local user closing the connection,\n    //it probably means the connection to the server has failed. Close the peer in this case.\n    if (active_mode == MODE_CLIENT && data->Reason != EOS_EConnectionClosedReason::EOS_CCR_ClosedByLocalUser) {\n        EOSGPacketPeerMediator::get_singleton()->unregister_peer(this);\n        _close();\n    }\n\n    //The peer has closed their connection. Once all peers have been removed, unregister from the mediator\n    if (connection_status == CONNECTION_DISCONNECTED && peers.is_empty()) {\n        EOSGPacketPeerMediator::get_singleton()->unregister_peer(this);\n    }\n\n    Dictionary ret;\n    ret[\"local_user_id\"] = local_user_id_str;\n    ret[\"remote_user_id\"] = remote_user_id_str;\n    ret[\"socket\"] = data->SocketId->SocketName;\n    ret[\"reason\"] = reason;\n    emit_signal(\"peer_connection_closed\", ret);\n}\n\n/****************************************\n * peer_connection_interrupted_callback\n * Parameters:\n *   data - data retrieved from the connection interrupted callback.\n * Description: A callback that is called by EOSGPacketPeerMediator when it receives a peer connection\n * interrupted notification. Callback only emits a signal containing the data when it is called.\n ****************************************/\nvoid EOSGMultiplayerPeer::peer_connection_interrupted_callback(const EOS_P2P_OnPeerConnectionInterruptedInfo *data) {\n    String local_user_id_str = eosg_product_user_id_to_string(data->LocalUserId);\n    String remote_user_id_str = eosg_product_user_id_to_string(data->RemoteUserId);\n    Dictionary ret;\n    ret[\"local_user_id\"] = local_user_id_str;\n    ret[\"remote_user_id\"] = remote_user_id_str;\n    ret[\"socket\"] = data->SocketId->SocketName;\n    emit_signal(\"peer_connection_interrupted\", ret);\n}\n\n/****************************************\n * connection_request_callback\n * Parameters:\n *   data - Contains data about the connection request received.\n * Description: A callback that is called by EOSGPacketPeerMediator when it receives a connection request\n * for this multiplayer instance. If this instance is a server or a mesh, the connection request is pushed\n * to the list of pending connection requests. If this instance is a client, the connection request is ignored.\n * If auto-accepting connection requests is set to true, the connection request is accepted immediately.\n ****************************************/\nvoid EOSGMultiplayerPeer::connection_request_callback(const ConnectionRequestData &data) {\n    if (active_mode == MODE_CLIENT || is_refusing_new_connections())\n        return;\n\n    EOS_ProductUserId remote_user_id = eosg_string_to_product_user_id(data.remote_user_id.utf8());\n\n    pending_connection_requests.push_back(remote_user_id);\n\n    Dictionary ret;\n    ret[\"local_user_id\"] = data.local_user_id;\n    ret[\"remote_user_id\"] = data.remote_user_id;\n    ret[\"socket\"] = String(data.socket_name);\n    emit_signal(\"incoming_connection_request\", ret);\n\n    if (!is_auto_accepting_connection_requests())\n        return;\n\n    accept_connection_request(data.remote_user_id);\n}\n\n/****************************************\n * ~EOSGMultiplayerPeer\n * Description: Destructor. Closes the multiplayer instance if it is still active.\n ****************************************/\nEOSGMultiplayerPeer::~EOSGMultiplayerPeer() {\n    if (active_mode != MODE_NONE) {\n        _close();\n    }\n}\n\n/****************************************\n * EOSGPacket::prepare\n * Description: Prepares the packet for sending. Allocates memory for the packet if not done so already.\n * Sets the packet header.\n ****************************************/\nvoid EOSGMultiplayerPeer::EOSGPacket::prepare() {\n    if (packet == nullptr) {\n        _alloc_packet();\n    }\n\n    packet->ptrw()[INDEX_EVENT_TYPE] = static_cast<uint8_t>(event);\n    packet->ptrw()[INDEX_TRANSFER_MODE] = static_cast<uint8_t>(reliability);\n    memcpy(packet->ptrw() + INDEX_PEER_ID, &from, sizeof(int));\n}\n\n/****************************************\n * EOSGPacket::store_payload\n * Parameters:\n *   payload_data - pointer to the payload data to be stored in the packet.\n *   payload_size_bytes - size of the payload in bytes.\n * Description: Stores the passed payload data into the packet. Allocates the packet to the correct\n * size so that it can fit the payload.\n ****************************************/\nvoid EOSGMultiplayerPeer::EOSGPacket::store_payload(const uint8_t *payload_data, const uint32_t payload_size_bytes) {\n    if (packet == nullptr) {\n        _alloc_packet(payload_size_bytes + PACKET_HEADER_SIZE);\n    }\n    if (packet->size() != payload_size_bytes + PACKET_HEADER_SIZE) {\n        size_bytes = payload_size_bytes + PACKET_HEADER_SIZE;\n        packet->resize(size_bytes);\n    }\n    memcpy(packet->ptrw() + INDEX_PAYLOAD_DATA, payload_data, payload_size_bytes);\n}\n\n/****************************************\n * EOSGSocket::close\n * Description: Closes the socket. Closes all connections with peers who are currently\n * connected. Clears the packet queue.\n ****************************************/\nvoid EOSGMultiplayerPeer::EOSGSocket::close() {\n    clear_packet_queue();\n\n    EOS_P2P_CloseConnectionsOptions options;\n    options.ApiVersion = EOS_P2P_CLOSECONNECTIONS_API_LATEST;\n    options.LocalUserId = s_local_user_id;\n    options.SocketId = &socket;\n    IEOS::get_singleton()->_p2p_close_all_connections(&options);\n}\n\n/****************************************\n * EOSGSocket::close\n * Description: Closes the socket. Closes all connections with peers who are currently\n * connected. Clears the packet queue.\n ****************************************/\nvoid EOSGMultiplayerPeer::EOSGSocket::clear_packets_from_peer(int p_peer) {\n    List<List<EOSGPacket>::Element *> del;\n    for (List<EOSGPacket>::Element *e = incoming_packets.front(); e != nullptr; e = e->next()) {\n        if (e->get().get_sender() != p_peer)\n            continue;\n        del.push_back(e);\n    }\n    for (List<EOSGPacket>::Element *e : del) {\n        e->erase();\n    }\n}\n\n/****************************************\n * EOSGSocket::_socket_id_is_valid\n * Parameters:\n *  socket_id: The socket id to validate.\n * Description: Validates a socket id. Checks if there are any invalid characters.\n * Also checks if the socket id is empty and if it meets the length requirements.\n * Socket id's can only contain alpha-numeric characters. If there\n * are any invalid characters in the socket id or if it's empty or exceeds the\n * character length limit, the method returns false.\n ****************************************/\nbool EOSGMultiplayerPeer::EOSGSocket::_socket_id_is_valid(const String &socket_id) {\n    if (socket_id.is_empty())\n        return false; //socket id should not be empty\n\n    if (socket_id.length() >= EOS_P2P_SOCKETID_SOCKETNAME_SIZE) {\n        return false; //socket id should not be longer than EOS_P2P_SOCKETID_SOCKETNAME_SIZE - 1 characters\n    }\n\n    //The ranges of certain characters in the ascii table.\n    int numeric_range_min = 48;\n    int numeric_range_max = 57;\n    int alpha_capitalized_range_min = 65;\n    int alpha_capitalized_range_max = 90;\n    int alpha_lowercase_range_min = 97;\n    int alpha_lowercase_range_max = 122;\n\n    CharString str = socket_id.ascii();\n    for (int i = 0; i < str.length(); i++) {\n        if (str[i] >= numeric_range_min && str[i] <= numeric_range_max) {\n            continue;\n        } else if (str[i] >= alpha_capitalized_range_min && str[i] <= alpha_capitalized_range_max) {\n            continue;\n        } else if (str[i] >= alpha_lowercase_range_min && str[i] <= alpha_lowercase_range_max) {\n            continue;\n        } else {\n            return false; //Invalid character found\n        }\n    }\n    return true;\n}\n"
  },
  {
    "path": "src/eosg_multiplayer_peer.h",
    "content": "#pragma once\n\n#include \"eos_p2p.h\"\n#include \"godot_cpp/classes/multiplayer_peer_extension.hpp\"\n#include \"godot_cpp/templates/hash_map.hpp\"\n#include \"utils.h\"\n#include <memory>\n\nnamespace godot {\n\nstruct ConnectionRequestData {\n    String socket_name;\n    String remote_user_id;\n    String local_user_id;\n};\n\nclass EOSGMultiplayerPeer : public MultiplayerPeerExtension {\n    GDCLASS(EOSGMultiplayerPeer, MultiplayerPeerExtension)\n\nprivate:\n    enum Event {\n        EVENT_STORE_PACKET,\n        EVENT_RECIEVE_PEER_ID,\n        EVENT_MESH_CONNECTION_REQUEST\n    };\n\n    enum {\n        INDEX_EVENT_TYPE = 0,\n        INDEX_TRANSFER_MODE = 1,\n        INDEX_PEER_ID = 2,\n        INDEX_PAYLOAD_DATA = 6,\n    };\n\n    enum {\n        CH_RELIABLE = 0,\n        CH_UNRELIABLE = 1,\n        CH_MAX = 2,\n    };\n\n    enum Mode {\n        MODE_NONE,\n        MODE_SERVER,\n        MODE_CLIENT,\n        MODE_MESH,\n    };\n\n    class EOSGPacket {\n    private:\n        std::shared_ptr<PackedByteArray> packet;\n        uint8_t channel = 0;\n        int32_t size_bytes = 0;\n        EOS_EPacketReliability reliability;\n        Event event;\n        int from = 0;\n\n        void _alloc_packet(int size_bytes = PACKET_HEADER_SIZE) {\n            packet = std::make_shared<PackedByteArray>();\n            packet->resize(size_bytes);\n            this->size_bytes = size_bytes;\n        }\n\n    public:\n        static const int PACKET_HEADER_SIZE = 6;\n\n        void prepare();\n        void store_payload(const uint8_t *payload_data, const uint32_t payload_size_bytes);\n\n        int payload_size() const {\n            return size_bytes - PACKET_HEADER_SIZE;\n        }\n\n        int packet_size() const {\n            return size_bytes;\n        }\n\n        uint8_t *get_payload() const {\n            if (size_bytes == 0 || size_bytes == PACKET_HEADER_SIZE) {\n                return nullptr; //Return nullptr if there's no payload.\n            }\n            return packet->ptrw() + INDEX_PAYLOAD_DATA;\n        }\n\n        uint8_t *get_packet() const {\n            if (packet.get() == nullptr) {\n                return nullptr; //Return nullptr if the packed has not been allocated\n            }\n            return packet->ptrw();\n        }\n\n        EOS_EPacketReliability get_reliability() const {\n            return reliability;\n        }\n\n        void set_reliability(EOS_EPacketReliability reliability) {\n            this->reliability = reliability;\n        }\n\n        uint8_t get_channel() const {\n            return channel;\n        }\n\n        void set_channel(uint8_t channel) {\n            this->channel = channel;\n        }\n\n        Event get_event() const {\n            return event;\n        }\n\n        void set_event(Event event) {\n            this->event = event;\n        }\n\n        int get_sender() const {\n            return from;\n        }\n\n        void set_sender(int p_id) {\n            from = p_id;\n        }\n    };\n\n    class EOSGSocket {\n    private:\n        EOS_P2P_SocketId socket;\n        List<EOSGPacket> incoming_packets;\n\n    public:\n        const EOS_P2P_SocketId *get_id() const {\n            return &socket;\n        }\n\n        String get_name() const {\n            return socket.SocketName;\n        }\n\n        void push_packet(EOSGPacket packet) {\n            incoming_packets.push_back(packet);\n        }\n\n        EOSGPacket pop_packet() {\n            EOSGPacket ret = incoming_packets.front()->get();\n            incoming_packets.pop_front();\n            return ret;\n        }\n\n        void clear_packet_queue() {\n            incoming_packets.clear();\n        }\n\n        bool has_packet() const {\n            return incoming_packets.size() != 0;\n        }\n\n        int get_packet_count() const {\n            return incoming_packets.size();\n        }\n\n        EOS_EPacketReliability get_packet_reliability() const {\n            EOSGPacket packet = incoming_packets.front()->get();\n            return packet.get_reliability();\n        }\n\n        int32_t get_packet_channel() const {\n            EOSGPacket packet = incoming_packets.front()->get();\n            return packet.get_channel();\n        }\n\n        int32_t get_packet_peer() const {\n            EOSGPacket packet = incoming_packets.front()->get();\n            return packet.get_sender();\n        }\n\n        void close();\n        void clear_packets_from_peer(int p_peer);\n        bool _socket_id_is_valid(const String &socket_id);\n\n        EOSGSocket() {}\n\n        EOSGSocket(const EOS_P2P_SocketId &socket) {\n            this->socket = socket;\n        }\n\n        EOSGSocket(const String &socket_name) {\n            memset(socket.SocketName, 0, sizeof(socket.SocketName));\n            ERR_FAIL_COND_MSG(!_socket_id_is_valid(socket_name), \"Failed to create socket. Socket id is not valid.\\nNOTE: Socket id cannot be empty, must only have alpha-numeric characters, and must not be longer than 32 characters\");\n            socket.ApiVersion = EOS_P2P_SOCKETID_API_LATEST;\n            STRNCPY_S(socket.SocketName, EOS_P2P_SOCKETID_SOCKETNAME_SIZE, socket_name.utf8(), socket_name.length());\n        }\n    };\n\n    _FORCE_INLINE_ bool _is_active() const { return active_mode != MODE_NONE; }\n\n    Error _broadcast(const EOSGPacket &packet, int exclude = 0);\n    Error _send_to(const EOS_ProductUserId &remote_peer, const EOSGPacket &packet);\n    bool _find_connection_request(const String &remote_user, EOS_ProductUserId &out_request);\n    EOS_EPacketReliability _convert_transfer_mode_to_eos_reliability(TransferMode mode) const;\n    TransferMode _convert_eos_reliability_to_transfer_mode(EOS_EPacketReliability reliability) const;\n    void _disconnect_remote_user(const EOS_ProductUserId &remote_user);\n    void _clear_peer_packet_queue(int p_id);\n\n    static EOS_ProductUserId s_local_user_id;\n\n    EOSGPacket current_packet;\n    uint32_t unique_id;\n    int target_peer = 0;\n    ConnectionStatus connection_status = CONNECTION_DISCONNECTED;\n    Mode active_mode = MODE_NONE;\n    EOS_Bool allow_delayed_delivery = EOS_TRUE;\n    bool auto_accept_connection_requests = true;\n    TransferMode transfer_mode = TransferMode::TRANSFER_MODE_RELIABLE;\n    uint32_t transfer_channel = CH_RELIABLE;\n    bool refusing_connections = false;\n    bool polling = false;\n\n    HashMap<uint32_t, EOS_ProductUserId> peers;\n\n    EOSGSocket socket;\n    List<EOS_ProductUserId> pending_connection_requests;\n\n    static void _bind_methods();\n\npublic:\n    static void set_local_user_id(const String &p_local_user_id);\n    static String get_local_user_id();\n\n    void peer_connection_established_callback(const EOS_P2P_OnPeerConnectionEstablishedInfo *data);\n    void remote_connection_closed_callback(const EOS_P2P_OnRemoteConnectionClosedInfo *data);\n    void peer_connection_interrupted_callback(const EOS_P2P_OnPeerConnectionInterruptedInfo *data);\n    void connection_request_callback(const ConnectionRequestData &data);\n\n    Error create_server(const String &socket_id);\n    Error create_client(const String &socket_id, const String &remote_user_id);\n    Error create_mesh(const String &socket_id);\n    Error add_mesh_peer(const String &remote_user);\n\n    String get_socket() const;\n    Array get_all_connection_requests();\n    String get_peer_user_id(int p_id);\n    int get_peer_id(const String &user_id);\n    bool has_peer(int peer_id);\n    bool has_user_id(const String &remote_user_id);\n    Dictionary get_all_peers();\n    void set_allow_delayed_delivery(bool allow);\n    bool is_allowing_delayed_delivery();\n    void set_auto_accept_connection_requests(bool enable);\n    bool is_auto_accepting_connection_requests();\n    void accept_connection_request(const String &remote_user);\n    void deny_connection_request(const String &remote_user);\n    void accept_all_connection_requests();\n    void deny_all_connection_requests();\n    int get_active_mode();\n\n    bool is_polling() {\n        return polling;\n    }\n\n    void set_is_polling(bool polling) {\n        this->polling = polling;\n    }\n\n    virtual Error _get_packet(const uint8_t **r_buffer, int32_t *r_buffer_size) override;\n    virtual Error _put_packet(const uint8_t *p_buffer, int32_t p_buffer_size) override;\n    virtual int32_t _get_available_packet_count() const override;\n    virtual int32_t _get_max_packet_size() const override;\n    virtual int32_t _get_packet_channel() const override;\n    virtual MultiplayerPeer::TransferMode _get_packet_mode() const override;\n    virtual void _set_transfer_channel(int32_t p_channel) override;\n    virtual int32_t _get_transfer_channel() const override;\n    virtual void _set_transfer_mode(MultiplayerPeer::TransferMode p_mode) override;\n    virtual MultiplayerPeer::TransferMode _get_transfer_mode() const override;\n    virtual void _set_target_peer(int32_t p_peer) override;\n    virtual int32_t _get_packet_peer() const override;\n    virtual bool _is_server() const override;\n    virtual void _poll() override;\n    virtual void _close() override;\n    virtual void _disconnect_peer(int32_t p_peer, bool p_force = false) override;\n    virtual int32_t _get_unique_id() const override;\n    virtual void _set_refuse_new_connections(bool p_enable) override;\n    virtual bool _is_refusing_new_connections() const override;\n    virtual bool _is_server_relay_supported() const override;\n    virtual MultiplayerPeer::ConnectionStatus _get_connection_status() const override;\n\n    EOSGMultiplayerPeer(){};\n    ~EOSGMultiplayerPeer();\n};\n} //namespace godot"
  },
  {
    "path": "src/eosg_packet_peer_mediator.cpp",
    "content": "/****************************************\n * EOSGPacketPeerMediator\n * Author: Dallin Lovin aka LowFire\n * Description: Manages EOSG multiplayer instances when they are active.\n * Multiplayer instances register their socket id with the mediator when\n * they become active and unregister their socket id when they close.\n * The mediator receives packets from the EOS P2P interface every process\n * frame and sorts those packets according to their destination socket so\n * that the appropriate multiplayer instance can poll them later. The mediator\n * receives EOS notifications and fowards it to the appropriate multiplayer\n * instance according to the socket the notification was received from.\n * Mediator manages incoming connection requests and forwards them to the\n * appropriate multiplayer instance according to the socket id of the\n * connection request. If there is no matching socket from any of the active\n * multiplayer instances, the mediator will hold onto the connection request\n * until either a multiplayer instance opens with a matching socket or until\n * the connection request times out.\n ****************************************/\n\n#include \"eosg_packet_peer_mediator.h\"\n#include \"godot_cpp/classes/rendering_server.hpp\"\n#include \"utils.h\"\n\nEOSGPacketPeerMediator *EOSGPacketPeerMediator::singleton = nullptr;\n\nvoid EOSGPacketPeerMediator::_bind_methods() {\n    ClassDB::bind_method(D_METHOD(\"_on_process_frame\"), &EOSGPacketPeerMediator::_on_process_frame);\n    ClassDB::bind_method(D_METHOD(\"_on_connect_interface_login\"), &EOSGPacketPeerMediator::_on_connect_interface_login);\n    ClassDB::bind_method(D_METHOD(\"get_total_packet_count\"), &EOSGPacketPeerMediator::get_total_packet_count);\n    ClassDB::bind_method(D_METHOD(\"get_sockets\"), &EOSGPacketPeerMediator::get_sockets);\n    ClassDB::bind_method(D_METHOD(\"get_packet_count_for_socket\", \"socket_id\"), &EOSGPacketPeerMediator::get_packet_count_for_socket);\n    ClassDB::bind_method(D_METHOD(\"has_socket\"), &EOSGPacketPeerMediator::has_socket);\n    ClassDB::bind_method(D_METHOD(\"get_packet_count_from_remote_user\"), &EOSGPacketPeerMediator::get_packet_count_from_remote_user);\n    ClassDB::bind_method(D_METHOD(\"get_queue_size_limit\"), &EOSGPacketPeerMediator::get_queue_size_limit);\n    ClassDB::bind_method(D_METHOD(\"set_queue_size_limit\", \"limit\"), &EOSGPacketPeerMediator::set_queue_size_limit);\n    ClassDB::bind_method(D_METHOD(\"get_connection_request_count\"), &EOSGPacketPeerMediator::get_connection_request_count);\n\n    ADD_SIGNAL(MethodInfo(\"packet_queue_full\"));\n    ADD_SIGNAL(MethodInfo(\"connection_request_received\", PropertyInfo(Variant::DICTIONARY, \"callback_data\")));\n    ADD_SIGNAL(MethodInfo(\"connection_request_removed\", PropertyInfo(Variant::DICTIONARY, \"callback_data\")));\n}\n\n/****************************************\n * _on_process_frame\n * Description: Method is connected to the game main loop's process signal so\n * that it can execute every process frame (see _init()). Checks if there are\n * any packets available from the incoming packet queue. If there are, receives\n * the packet and sorts it into separate queues according to it's destination socket. Packets that\n * are peer id packets (packets with EVENT_RECIEVE_PEER_ID) and pushed to the front. Packets will\n * stop being polled if the queue size limit is reached.\n ****************************************/\nvoid EOSGPacketPeerMediator::_on_process_frame() {\n    if (EOSGMultiplayerPeer::get_local_user_id().is_empty())\n        return;\n    if (socket_packet_queues.size() == 0)\n        return;\n    if (get_total_packet_count() >= max_queue_size)\n        return;\n\n    String local_user_id_str = EOSGMultiplayerPeer::get_local_user_id();\n    EOS_ProductUserId local_user_id = eosg_string_to_product_user_id(local_user_id_str.utf8());\n    EOS_P2P_GetNextReceivedPacketSizeOptions packet_size_options;\n    packet_size_options.ApiVersion = EOS_P2P_GETNEXTRECEIVEDPACKETSIZE_API_LATEST;\n    packet_size_options.LocalUserId = local_user_id;\n    packet_size_options.RequestedChannel = nullptr;\n    uint32_t max_packet_size;\n\n    EOS_P2P_ReceivePacketOptions recieve_packet_options;\n    recieve_packet_options.ApiVersion = EOS_P2P_RECEIVEPACKET_API_LATEST;\n    recieve_packet_options.LocalUserId = local_user_id;\n    recieve_packet_options.MaxDataSizeBytes = EOS_P2P_MAX_PACKET_SIZE;\n    recieve_packet_options.RequestedChannel = nullptr;\n\n    bool next_packet_available = true;\n    EOS_EResult result = EOS_EResult::EOS_Success;\n\n    do {\n        result = IEOS::get_singleton()->_p2p_get_next_packet_size(&packet_size_options, &max_packet_size);\n\n        ERR_FAIL_COND_MSG(result == EOS_EResult::EOS_InvalidParameters, \"Failed to get packet size! Invalid parameters.\");\n\n        if (result == EOS_EResult::EOS_Success) {\n            next_packet_available = true;\n        } else {\n            next_packet_available = false;\n        }\n\n        if (next_packet_available) {\n            PackedByteArray packet_data;\n            packet_data.resize(max_packet_size);\n            uint32_t buffer_size;\n            uint8_t channel;\n            EOS_P2P_SocketId socket;\n            EOS_ProductUserId remote_user;\n            result = IEOS::get_singleton()->_p2p_receive_packet(&recieve_packet_options, packet_data.ptrw(), &buffer_size, &channel, &remote_user, &socket);\n            String socket_id_str = socket.SocketName;\n\n            ERR_FAIL_COND_MSG(result == EOS_EResult::EOS_InvalidParameters, \"Failed to get packet! Invalid parameters.\");\n            ERR_FAIL_COND_MSG(result == EOS_EResult::EOS_NotFound, \"Failed to get packet! Packet is too large. This should not have happened.\");\n\n            if (!socket_packet_queues.has(socket_id_str))\n                return; //invalid socket. Drop the packet.\n\n            PacketData packet;\n            packet.store(packet_data.ptrw(), max_packet_size);\n            packet.set_channel(channel);\n            packet.set_sender(remote_user);\n            uint8_t event = packet.get_data()->ptrw()[0];\n            if (event == 1) {\n                socket_packet_queues[socket_id_str].push_front(packet);\n            } else {\n                socket_packet_queues[socket_id_str].push_back(packet);\n            }\n            if (get_total_packet_count() >= max_queue_size) {\n                emit_signal(\"packet_queue_full\");\n                break;\n            }\n        }\n    } while (next_packet_available);\n}\n\n/****************************************\n * poll_next_packet\n * Parameters:\n *   socket_id - The socket to poll a packet from.\n *   out_packet - An out parameter that returns the polled packet.\n * Description: Polls the next packet available for the given socket.\n * Returns true if a packet has been successfully polled. False otherwise.\n ****************************************/\nbool EOSGPacketPeerMediator::poll_next_packet(const String &socket_id, PacketData *out_packet) {\n    if (!socket_packet_queues.has(socket_id))\n        return false;\n    if (socket_packet_queues[socket_id].size() == 0)\n        return false;\n\n    PacketData next_packet = socket_packet_queues[socket_id].front()->get();\n    *out_packet = next_packet;\n    socket_packet_queues[socket_id].pop_front();\n    return true;\n}\n\n/****************************************\n * register_peer\n * Parameters:\n *   peer - The peer to be registered with the mediator.\n * Description: Registers a peer and it's socket with the mediator.\n * Once registered, a peer can receive packets, EOS notifications, and connection requests.\n ****************************************/\nbool EOSGPacketPeerMediator::register_peer(EOSGMultiplayerPeer *peer) {\n    ERR_FAIL_COND_V_MSG(!initialized, false, \"Failed to register peer. EOSGPacketPeerMediator has not been initialized. Call EOSGPacketPeerMediator.init() before starting a multiplayer instance.\");\n    ERR_FAIL_COND_V_MSG(peer->get_socket().is_empty(), false, \"Failed to register peer. Peer is not active.\");\n    ERR_FAIL_COND_V_MSG(active_peers.has(peer->get_socket()), false, \"Failed to register peer. This peer has already been registered.\");\n\n    active_peers.insert(peer->get_socket(), peer);\n    socket_packet_queues.insert(peer->get_socket(), List<PacketData>());\n\n    _forward_pending_connection_requests(peer);\n\n    return true;\n}\n\n/****************************************\n * unregister_peer\n * Parameters:\n *   peer - The peer to be unregistered with the mediator.\n * Description: Unregisteres a peer and it's socket with the mediator.\n * Peers can no longer receive packets, notifications, or connection requests once this is done.\n * unregistration usually happens when a peer closes.\n ****************************************/\nvoid EOSGPacketPeerMediator::unregister_peer(EOSGMultiplayerPeer *peer) {\n    if (!active_peers.has(peer->get_socket()))\n        return;\n\n    clear_packet_queue(peer->get_socket());\n    socket_packet_queues.erase(peer->get_socket());\n    active_peers.erase(peer->get_socket());\n}\n\n/****************************************\n * clear_packet_queue\n * Parameters:\n *   socket_id - The socket to clear packets from.\n * Description: Removes all packets queued for the given socket.\n ****************************************/\nvoid EOSGPacketPeerMediator::clear_packet_queue(const String &socket_id) {\n    ERR_FAIL_COND_MSG(!socket_packet_queues.has(socket_id), vformat(\"Failed to clear packet queue for socket \\\"%s\\\". Socket was not registered.\", socket_id));\n\n    socket_packet_queues[socket_id].clear();\n}\n\n/****************************************\n * clear_packets_from_remote_user\n * Parameters:\n *   socket_id - The socket to clear packets from.\n *\tremote_user_id - The user to remove packets from.\n * Description: Removes all packets queued for the given socket and from the given remote user.\n * This is usually called when a peer disconnects. All packets from that peer are removed.\n ****************************************/\nvoid EOSGPacketPeerMediator::clear_packets_from_remote_user(const String &socket_id, const String &remote_user_id) {\n    ERR_FAIL_COND_MSG(!socket_packet_queues.has(socket_id), vformat(\"Failed to clear packet queue for socket \\\"%s\\\". Socket was not registered.\", socket_id));\n\n    List<List<PacketData>::Element *> del;\n    for (List<PacketData>::Element *e = socket_packet_queues[socket_id].front(); e != nullptr; e = e->next()) {\n        if (e->get().get_sender() != remote_user_id)\n            continue;\n        del.push_back(e);\n    }\n    for (List<PacketData>::Element *e : del) {\n        e->erase();\n    }\n}\n\n/****************************************\n * _init\n * Description: Initialized EOSGPacketPeerMediator. Connects _on_process_frame to the\n * main loop's process signal. Adds EOS callbacks so that it can receive notifications.\n ****************************************/\nvoid EOSGPacketPeerMediator::_init() {\n    ERR_FAIL_COND_MSG(EOSGMultiplayerPeer::get_local_user_id().is_empty(), \"Failed to initialize EOSGPacketPeerMediator. Local user id has not been set.\");\n    if (initialized)\n        return;\n\n    MainLoop *main_loop = Engine::get_singleton()->get_main_loop();\n    ERR_FAIL_COND_MSG(!main_loop->has_signal(\"process_frame\"), \"Failed to initialize EOSGPacketPeerMediator. Main loop does not have the process_frame() signal.\");\n    main_loop->connect(\"process_frame\", process_frame_callback);\n\n    //Register callbacks\n    _add_connection_closed_callback();\n    _add_connection_established_callback();\n    _add_connection_interrupted_callback();\n    _add_connection_request_callback();\n\n    initialized = true;\n}\n\n/****************************************\n * _terminate\n * Description: Terminates EOSGPacketPeerMediator. Disconnects from the\n * main loop's process signal. Removes all EOS callbacks.\n ****************************************/\nvoid EOSGPacketPeerMediator::_terminate() {\n    if (!initialized)\n        return;\n\n    MainLoop *main_loop = Engine::get_singleton()->get_main_loop();\n    main_loop->disconnect(\"process_frame\", process_frame_callback);\n\n    //Unregister callbacks\n    IEOS::get_singleton()->_p2p_remove_notify_peer_connection_established(connection_established_callback_id);\n    IEOS::get_singleton()->_p2p_remove_notify_peer_connection_interrupted(connection_interrupted_callback_id);\n    IEOS::get_singleton()->_p2p_remove_notify_peer_connection_closed(connection_closed_callback_id);\n    IEOS::get_singleton()->_p2p_remove_notify_peer_connection_request(connection_request_callback_id);\n\n    initialized = false;\n}\n\n/****************************************\n * get_packet_count_from_remote_user\n * Parameters:\n *\tremote_user - The user to count packets for.\n * \tsocket_id - The socket to count packets for.\n * Description: Counts the number of packets from the given remote user and for\n * the given socket. Returns the packet count.\n ****************************************/\nint EOSGPacketPeerMediator::get_packet_count_from_remote_user(const String &remote_user, const String &socket_id) {\n    ERR_FAIL_COND_V_MSG(!socket_packet_queues.has(socket_id), 0, vformat(\"Failed to get packet count for remote user. Socket \\\"%s\\\" does not exist\", socket_id));\n    int ret = 0;\n    for (PacketData &data : socket_packet_queues[socket_id]) {\n        if (data.get_sender() == remote_user) {\n            ret++;\n        }\n    }\n    return ret;\n}\n\n/****************************************\n * next_packet_is_peer_id_packet\n * Parameters:\n * \tsocket_id - The socket to check\n * Description: Checks if there is a peer id packet queued for the given socket.\n * Returns true if there is, false otherwise.\n ****************************************/\nbool EOSGPacketPeerMediator::next_packet_is_peer_id_packet(const String &socket_id) {\n    ERR_FAIL_COND_V_MSG(!socket_packet_queues.has(socket_id), false, \"Failed to check next packet. Socket \\\"%s\\\" does not exist.\");\n    if (socket_packet_queues[socket_id].size() == 0)\n        return false;\n    PacketData packet = socket_packet_queues[socket_id][0];\n    uint8_t event = packet.get_data()->ptrw()[0];\n    if (event == 1)\n        return true;\n    return false;\n}\n\n/****************************************\n * _on_peer_connection_established\n * Parameters:\n * \tdata - Data returned from the notification\n * Description: An EOS callback that is called when a connection is established with a peer.\n * Forwards the data to the appropriate multiplayer instance using the socket id provided in the data.\n ****************************************/\nvoid EOS_CALL EOSGPacketPeerMediator::_on_peer_connection_established(const EOS_P2P_OnPeerConnectionEstablishedInfo *data) {\n    String socket_id = data->SocketId->SocketName;\n    if (!singleton->active_peers.has(socket_id))\n        return;\n    singleton->active_peers[socket_id]->peer_connection_established_callback(data);\n}\n\n/****************************************\n * _on_peer_connection_interrupted\n * Parameters:\n * \tdata - Data returned from the notification\n * Description: An EOS callback that is called when the connection with a peer is interrupted.\n * Forwards the data to the appropriate multiplayer instance using the socket id provided in the data.\n ****************************************/\nvoid EOS_CALL EOSGPacketPeerMediator::_on_peer_connection_interrupted(const EOS_P2P_OnPeerConnectionInterruptedInfo *data) {\n    String socket_id = data->SocketId->SocketName;\n    if (!singleton->active_peers.has(socket_id))\n        return;\n    singleton->active_peers[socket_id]->peer_connection_interrupted_callback(data);\n}\n\n/****************************************\n * _on_remote_connection_closed\n * Parameters:\n * \tdata - Data returned from the notification\n * Description: An EOS callback that is called when the connection with a peer is closed.\n * Checks to see if there were any connection requests associated with the closed connection.\n * If so, it removes that connection request. Forwards the data to the appropriate multiplayer instance using\n * the socket id provided in the data.\n ****************************************/\nvoid EOS_CALL EOSGPacketPeerMediator::_on_remote_connection_closed(const EOS_P2P_OnRemoteConnectionClosedInfo *data) {\n    String socket_name = data->SocketId->SocketName;\n    //Check if any connection requests need to be removed.\n    List<ConnectionRequestData>::Element *e = singleton->pending_connection_requests.front();\n    for (; e != nullptr; e = e->next()) {\n        String request_remote_user_id = e->get().remote_user_id;\n        String closed_remote_user_id = eosg_product_user_id_to_string(data->RemoteUserId);\n        String request_socket_name = e->get().socket_name;\n        if (request_remote_user_id == closed_remote_user_id && socket_name == request_socket_name) {\n            Dictionary ret;\n            ret[\"local_user_id\"] = e->get().local_user_id;\n            ret[\"remote_user_id\"] = e->get().remote_user_id;\n            ret[\"socket_id\"] = e->get().socket_name;\n            singleton->emit_signal(\"connection_request_removed\", ret);\n            e->erase();\n            break;\n        }\n    }\n    if (!singleton->active_peers.has(socket_name))\n        return;\n    singleton->active_peers[socket_name]->remote_connection_closed_callback(data);\n}\n\n/****************************************\n * _on_incoming_connection_request\n * Parameters:\n * \tdata - Data returned from the notification\n * Description: An EOS callback that is called when a connection request is received.\n * Checks if there are any peers available to receive the connection request using\n * the destination socket id. If there isn't, stores the connection request for later.\n * If there is, forward the connection request to that multiplayer instance.\n ****************************************/\nvoid EOS_CALL EOSGPacketPeerMediator::_on_incoming_connection_request(const EOS_P2P_OnIncomingConnectionRequestInfo *data) {\n    ConnectionRequestData request_data;\n    request_data.local_user_id = eosg_product_user_id_to_string(data->LocalUserId);\n    request_data.remote_user_id = eosg_product_user_id_to_string(data->RemoteUserId);\n    request_data.socket_name = data->SocketId->SocketName;\n    if (!singleton->active_peers.has(request_data.socket_name)) {\n        //Hold onto the connection request just in case a socket does get opened with this socket id\n        singleton->pending_connection_requests.push_back(request_data);\n        Dictionary ret;\n        ret[\"local_user_id\"] = request_data.local_user_id;\n        ret[\"remote_user_id\"] = request_data.remote_user_id;\n        ret[\"socket_id\"] = request_data.socket_name;\n        singleton->emit_signal(\"connection_request_received\", ret);\n        return;\n    }\n    singleton->active_peers[request_data.socket_name]->connection_request_callback(request_data);\n}\n\n/****************************************\n * _on_connect_interface_login\n * Parameters:\n * \tdata - Contains info about the login.\n * Description: Called when the user logs into the connect interface. Sets the\n * local user id received from the login and initialized EOSGPacketPeerMediator.\n ****************************************/\nvoid EOSGPacketPeerMediator::_on_connect_interface_login(Dictionary data) {\n    int result_code = data[\"result_code\"];\n    if (static_cast<EOS_EResult>(result_code) != EOS_EResult::EOS_Success) {\n        return;\n    }\n    String local_user_id = data[\"local_user_id\"];\n    if (local_user_id != \"\") {\n        EOSGMultiplayerPeer::set_local_user_id(local_user_id);\n        EOSGPacketPeerMediator::get_singleton()->_init();\n    } else {\n        ERR_FAIL_MSG(\"Local user id was not set on connect interface login.\");\n    }\n    IEOS::get_singleton()->disconnect(\"connect_interface_login_callback\", connect_interface_login_callback);\n}\n\n/****************************************\n * _add_connection_established_callback\n * Parameters:\n * Description: Adds the peer connection established callback. This is called\n * in _init()\n ****************************************/\nbool EOSGPacketPeerMediator::_add_connection_established_callback() {\n    String local_user_id_str = EOSGMultiplayerPeer::get_local_user_id();\n    EOS_ProductUserId local_user_id = eosg_string_to_product_user_id(local_user_id_str.utf8());\n    EOS_P2P_AddNotifyPeerConnectionEstablishedOptions connection_established_options;\n    connection_established_options.ApiVersion = EOS_P2P_ADDNOTIFYPEERCONNECTIONESTABLISHED_API_LATEST;\n    connection_established_options.LocalUserId = local_user_id;\n    connection_established_options.SocketId = nullptr;\n    connection_established_callback_id = IEOS::get_singleton()->_p2p_add_notify_peer_connection_established(&connection_established_options,\n            _on_peer_connection_established);\n    ERR_FAIL_COND_V_MSG(connection_established_callback_id == EOS_INVALID_NOTIFICATIONID, false, \"Failed to add connection established callback.\");\n    return true;\n}\n\n/****************************************\n * _add_connection_interrupted_callback\n * Description: Adds the peer connection interrupted callback. This is called\n * in _init()\n ****************************************/\nbool EOSGPacketPeerMediator::_add_connection_interrupted_callback() {\n    String local_user_id_str = EOSGMultiplayerPeer::get_local_user_id();\n    EOS_ProductUserId local_user_id = eosg_string_to_product_user_id(local_user_id_str.utf8());\n    EOS_P2P_AddNotifyPeerConnectionInterruptedOptions connection_interrupted_options;\n    connection_interrupted_options.ApiVersion = EOS_P2P_ADDNOTIFYPEERCONNECTIONINTERRUPTED_API_LATEST;\n    connection_interrupted_options.LocalUserId = local_user_id;\n    connection_interrupted_options.SocketId = nullptr;\n    connection_interrupted_callback_id = IEOS::get_singleton()->_p2p_add_notify_peer_connection_interrupted(&connection_interrupted_options,\n            _on_peer_connection_interrupted);\n    ERR_FAIL_COND_V_MSG(connection_interrupted_callback_id == EOS_INVALID_NOTIFICATIONID, false, \"Failed to add connection interrupted callback.\");\n    return true;\n}\n\n/****************************************\n * _add_connection_closed_callback\n * Description: Adds the peer connection closed callback. This is called\n * in _init()\n ****************************************/\nbool EOSGPacketPeerMediator::_add_connection_closed_callback() {\n    String local_user_id_str = EOSGMultiplayerPeer::get_local_user_id();\n    EOS_ProductUserId local_user_id = eosg_string_to_product_user_id(local_user_id_str.utf8());\n    EOS_P2P_AddNotifyPeerConnectionClosedOptions connection_closed_options;\n    connection_closed_options.ApiVersion = EOS_P2P_ADDNOTIFYPEERCONNECTIONCLOSED_API_LATEST;\n    connection_closed_options.LocalUserId = local_user_id;\n    connection_closed_options.SocketId = nullptr;\n    connection_closed_callback_id = IEOS::get_singleton()->_p2p_add_notify_peer_connection_closed(&connection_closed_options,\n            _on_remote_connection_closed);\n    ERR_FAIL_COND_V_MSG(connection_closed_callback_id == EOS_INVALID_NOTIFICATIONID, false, \"Failed to add connection closed callback.\");\n    return true;\n}\n\n/****************************************\n * _add_connection_request_callback\n * Description: Adds the peer connection request callback. This is called\n * in _init()\n ****************************************/\nbool EOSGPacketPeerMediator::_add_connection_request_callback() {\n    String local_user_id_str = EOSGMultiplayerPeer::get_local_user_id();\n    EOS_ProductUserId local_user_id = eosg_string_to_product_user_id(local_user_id_str.utf8());\n    EOS_P2P_AddNotifyPeerConnectionRequestOptions connection_request_options;\n    connection_request_options.ApiVersion = EOS_P2P_ADDNOTIFYPEERCONNECTIONREQUEST_API_LATEST;\n    connection_request_options.LocalUserId = local_user_id;\n    connection_request_options.SocketId = nullptr;\n    connection_request_callback_id = IEOS::get_singleton()->_p2p_add_notify_peer_connection_request(&connection_request_options,\n            _on_incoming_connection_request);\n    ERR_FAIL_COND_V_MSG(connection_request_callback_id == EOS_INVALID_NOTIFICATIONID, false, \"Failed to add connection request callback.\");\n    return true;\n}\n\n/****************************************\n * _forward_pending_connection_requests\n * Parameters:\n *\tpeer - The peer to forward connection requests to.\n * Description: Attempts to forward any pending connection requests to the given multiplayer instance.\n * If none of the pending requests match the multiplayer instance's socket, then no connection requests\n * are forwarded.\n ****************************************/\nvoid EOSGPacketPeerMediator::_forward_pending_connection_requests(EOSGMultiplayerPeer *peer) {\n    List<ConnectionRequestData>::Element *e = pending_connection_requests.front();\n    List<List<ConnectionRequestData>::Element *> del;\n    for (; e != nullptr; e = e->next()) {\n        if (peer->get_socket() != e->get().socket_name)\n            continue;\n        peer->connection_request_callback(e->get());\n        del.push_back(e);\n    }\n    for (List<ConnectionRequestData>::Element *e : del) {\n        Dictionary ret;\n        ret[\"local_user_id\"] = e->get().local_user_id;\n        ret[\"remote_user_id\"] = e->get().remote_user_id;\n        ret[\"socket_id\"] = e->get().socket_name;\n        emit_signal(\"connection_request_removed\", ret);\n        e->erase();\n    }\n}\n\n/****************************************\n * EOSGPacketPeerMediator\n * Description: Default constructor. Sets the singleton. Connects\n * to the connect interface login callback so that the class knows\n * when to initialize.\n ****************************************/\nEOSGPacketPeerMediator::EOSGPacketPeerMediator() {\n    ERR_FAIL_COND_MSG(singleton != nullptr, \"EOSGPacketPeerMediator already initialized\");\n    singleton = this;\n\n    process_frame_callback = Callable(this, \"_on_process_frame\");\n\n    connect_interface_login_callback = Callable(this, \"_on_connect_interface_login\");\n    IEOS::get_singleton()->connect(\"connect_interface_login_callback\", connect_interface_login_callback);\n}\n\n/****************************************\n * !EOSGPacketPeerMediator\n * Description: Destructor. Sets singleton to null.\n ****************************************/\nEOSGPacketPeerMediator::~EOSGPacketPeerMediator() {\n    if (singleton != this)\n        return;\n    singleton = nullptr;\n}"
  },
  {
    "path": "src/eosg_packet_peer_mediator.h",
    "content": "\n#include \"eosg_multiplayer_peer.h\"\n#include \"godot_cpp/classes/engine.hpp\"\n#include \"godot_cpp/classes/ref_counted.hpp\"\n#include \"godot_cpp/classes/scene_tree.hpp\"\n\nnamespace godot {\nstruct PacketData {\nprivate:\n    std::shared_ptr<PackedByteArray> data;\n    String remote_user_id;\n    int size_bytes = 0;\n    int channel = 0;\n\npublic:\n    void store(uint8_t *packet, int size_bytes) {\n        if (data == nullptr) {\n            data = std::make_shared<PackedByteArray>();\n        }\n        this->size_bytes = size_bytes;\n        data->resize(size_bytes);\n        memcpy(data->ptrw(), packet, size_bytes);\n    }\n\n    int size() {\n        return size_bytes;\n    }\n\n    int get_channel() {\n        return channel;\n    }\n\n    String get_sender() {\n        return remote_user_id;\n    }\n\n    void set_channel(int channel) {\n        this->channel = channel;\n    }\n\n    void set_sender(EOS_ProductUserId sender) {\n        remote_user_id = eosg_product_user_id_to_string(sender);\n    }\n\n    PackedByteArray *get_data() {\n        return data.get();\n    }\n};\n\nclass EOSGPacketPeerMediator : public Object {\n    GDCLASS(EOSGPacketPeerMediator, Object)\n\nprivate:\n    static EOSGPacketPeerMediator *singleton;\n    Callable process_frame_callback;\n    Callable connect_interface_login_callback;\n    static void _bind_methods();\n\n    HashMap<String, EOSGMultiplayerPeer *> active_peers;\n    HashMap<String, List<PacketData>> socket_packet_queues;\n    List<ConnectionRequestData> pending_connection_requests;\n    int max_queue_size = 5000;\n    bool initialized = false;\n\n    void _on_process_frame();\n    void _init();\n    void _terminate();\n\n    static void EOS_CALL _on_peer_connection_established(const EOS_P2P_OnPeerConnectionEstablishedInfo *data);\n    static void EOS_CALL _on_peer_connection_interrupted(const EOS_P2P_OnPeerConnectionInterruptedInfo *data);\n    static void EOS_CALL _on_remote_connection_closed(const EOS_P2P_OnRemoteConnectionClosedInfo *data);\n    static void EOS_CALL _on_incoming_connection_request(const EOS_P2P_OnIncomingConnectionRequestInfo *data);\n    void _on_connect_interface_login(Dictionary data);\n    bool _add_connection_established_callback();\n    bool _add_connection_closed_callback();\n    bool _add_connection_interrupted_callback();\n    bool _add_connection_request_callback();\n    void _forward_pending_connection_requests(EOSGMultiplayerPeer *peer);\n\n    EOS_NotificationId connection_established_callback_id = EOS_INVALID_NOTIFICATIONID;\n    EOS_NotificationId connection_interrupted_callback_id = EOS_INVALID_NOTIFICATIONID;\n    EOS_NotificationId connection_closed_callback_id = EOS_INVALID_NOTIFICATIONID;\n    EOS_NotificationId connection_request_callback_id = EOS_INVALID_NOTIFICATIONID;\n\npublic:\n    static EOSGPacketPeerMediator *get_singleton() {\n        return singleton;\n    }\n\n    int get_total_packet_count() {\n        int ret = 0;\n        for (KeyValue<String, List<PacketData>> &E : socket_packet_queues) {\n            ret += E.value.size();\n        }\n        return ret;\n    }\n\n    int get_packet_count_for_socket(const String &socket_id) {\n        ERR_FAIL_COND_V_MSG(!socket_packet_queues.has(socket_id), 0, \"Failed to get packet count for socket \\\"%s\\\". Socket does not exist.\");\n        return socket_packet_queues[socket_id].size();\n    }\n\n    Array get_sockets() {\n        Array ret;\n        for (KeyValue<String, List<PacketData>> &E : socket_packet_queues) {\n            ret.push_back(E.key);\n        }\n        return ret;\n    }\n\n    bool has_socket(const String &socket_id) {\n        return socket_packet_queues.has(socket_id);\n    }\n\n    int get_queue_size_limit() {\n        return max_queue_size;\n    }\n\n    void set_queue_size_limit(int limit) {\n        ERR_FAIL_COND_MSG(limit < 1, \"Cannot set queue size limit. Limit must be greater than 0\");\n        max_queue_size = limit;\n    }\n\n    int get_connection_request_count() {\n        return pending_connection_requests.size();\n    }\n\n    int get_packet_count_from_remote_user(const String &remote_user, const String &socket_id);\n    bool poll_next_packet(const String &socket_id, PacketData *out_packet);\n    bool next_packet_is_peer_id_packet(const String &socket_id);\n    bool register_peer(EOSGMultiplayerPeer *peer);\n    void unregister_peer(EOSGMultiplayerPeer *peer);\n    void clear_packet_queue(const String &socket_id);\n    void clear_packets_from_remote_user(const String &socket_id, const String &remote_user_id);\n\n    EOSGPacketPeerMediator();\n    ~EOSGPacketPeerMediator();\n};\n} //namespace godot"
  },
  {
    "path": "src/eosg_playerdatastorage_file_transfer_request.cpp",
    "content": "#include \"eosg_playerdatastorage_file_transfer_request.h\"\n#include \"eos_playerdatastorage.h\"\n#include \"utils.h\"\n\nusing namespace godot;\n\nvoid EOSGPlayerDataStorageFileTransferRequest::_bind_methods() {\n    ClassDB::bind_method(D_METHOD(\"get_file_request_state\"), &EOSGPlayerDataStorageFileTransferRequest::get_file_request_state);\n    ClassDB::bind_method(D_METHOD(\"get_filename\"), &EOSGPlayerDataStorageFileTransferRequest::get_filename);\n    ClassDB::bind_method(D_METHOD(\"cancel_request\"), &EOSGPlayerDataStorageFileTransferRequest::cancel_request);\n\n    ADD_SIGNAL(MethodInfo(\"file_transfer_progress_callback\", PropertyInfo(Variant::DICTIONARY, \"callback_data\")));\n}\n\nint EOSGPlayerDataStorageFileTransferRequest::get_file_request_state() {\n    ERR_FAIL_NULL_V(m_internal, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    return static_cast<int>(EOS_PlayerDataStorageFileTransferRequest_GetFileRequestState(m_internal));\n}\n\nDictionary EOSGPlayerDataStorageFileTransferRequest::get_filename() {\n    ERR_FAIL_NULL_V(m_internal, {});\n    Dictionary ret;\n    if (m_internal == nullptr) {\n        ret[\"result_code\"] = static_cast<int>(EOS_EResult::EOS_InvalidState);\n        ret[\"filename\"] = \"\";\n        return ret;\n    }\n    char *outBuffer = (char *)(memalloc(EOS_PLAYERDATASTORAGE_FILENAME_MAX_LENGTH_BYTES + 1));\n    int outBufferLength = EOS_PLAYERDATASTORAGE_FILENAME_MAX_LENGTH_BYTES + 1;\n    EOS_EResult result = EOS_PlayerDataStorageFileTransferRequest_GetFilename(m_internal, EOS_PLAYERDATASTORAGE_FILENAME_MAX_LENGTH_BYTES + 1, outBuffer, &outBufferLength);\n    ret[\"result_code\"] = static_cast<int>(result);\n    ret[\"filename\"] = EOSG_GET_STRING(outBuffer);\n    memfree(outBuffer);\n    return ret;\n}\n\nint EOSGPlayerDataStorageFileTransferRequest::cancel_request() {\n    ERR_FAIL_NULL_V(m_internal, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    return static_cast<int>(EOS_PlayerDataStorageFileTransferRequest_CancelRequest(m_internal));\n}"
  },
  {
    "path": "src/eosg_playerdatastorage_file_transfer_request.h",
    "content": "#pragma once\n#include \"eos_playerdatastorage.h\"\n#include \"eosg_file_transfer_request.h\"\n#include \"godot_cpp/classes/ref_counted.hpp\"\n\nnamespace godot {\n\nclass EOSGPlayerDataStorageFileTransferRequest : public EOSGFileTransferRequest {\n    GDCLASS(EOSGPlayerDataStorageFileTransferRequest, EOSGFileTransferRequest)\n\nprivate:\n    EOS_HPlayerDataStorageFileTransferRequest m_internal = nullptr;\n    static void _bind_methods();\n\npublic:\n    Dictionary get_filename() override;\n    int cancel_request() override;\n    int get_file_request_state() override;\n\n    EOSGPlayerDataStorageFileTransferRequest(){};\n    ~EOSGPlayerDataStorageFileTransferRequest() {\n        if (m_internal != nullptr) {\n            EOS_PlayerDataStorageFileTransferRequest_Release(m_internal);\n\t\t\tm_internal = nullptr;\n        }\n    }\n\n    void set_internal(EOS_HPlayerDataStorageFileTransferRequest p_internal) {\n        m_internal = p_internal;\n    }\n\n    EOS_HPlayerDataStorageFileTransferRequest get_internal() {\n        return m_internal;\n    }\n};\n\n} //namespace godot\n"
  },
  {
    "path": "src/eosg_presence_modification.cpp",
    "content": "#include \"eosg_presence_modification.h\"\n\n#include \"utils.h\"\n\nusing namespace godot;\n\nvoid EOSGPresenceModification::_bind_methods() {\n    ClassDB::bind_method(D_METHOD(\"set_status\", \"new_status\"), &EOSGPresenceModification::set_status);\n    ClassDB::bind_method(D_METHOD(\"set_raw_rich_text\", \"new_raw_rich_text\"), &EOSGPresenceModification::set_raw_rich_text);\n    ClassDB::bind_method(D_METHOD(\"set_data\", \"new_data\"), &EOSGPresenceModification::set_data);\n    ClassDB::bind_method(D_METHOD(\"delete_data\", \"keys\"), &EOSGPresenceModification::delete_data);\n    ClassDB::bind_method(D_METHOD(\"set_join_info\", \"new_join_info\"), &EOSGPresenceModification::set_join_info);\n}\n\nint EOSGPresenceModification::set_status(int new_status) {\n\tERR_FAIL_NULL_V(m_internal, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    EOS_PresenceModification_SetStatusOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_PRESENCE_SETPRESENCE_API_LATEST;\n    options.Status = static_cast<EOS_Presence_EStatus>(new_status);\n\n    return static_cast<int>(EOS_PresenceModification_SetStatus(m_internal, &options));\n}\n\nint EOSGPresenceModification::set_raw_rich_text(const String &p_raw_rich_text) {\n\tERR_FAIL_NULL_V(m_internal, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    CharString new_raw_rich_text = VARIANT_TO_CHARSTRING(p_raw_rich_text);\n\n    EOS_PresenceModification_SetRawRichTextOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_PRESENCE_SETRAWRICHTEXT_API_LATEST;\n    options.RichText = new_raw_rich_text.get_data();\n\n    return static_cast<int>(EOS_PresenceModification_SetRawRichText(m_internal, &options));\n}\n\nint EOSGPresenceModification::set_data(Dictionary p_data) {\n\tERR_FAIL_NULL_V(m_internal, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    int records_count = p_data.keys().size();\n    EOS_Presence_DataRecord *records = (EOS_Presence_DataRecord *)memalloc(sizeof(EOS_Presence_DataRecord) * records_count);\n\n    PERSISTENT_CHAR_ARRAY_CREATE(data_keys, data_keys_charstrings, records_count);\n    PERSISTENT_CHAR_ARRAY_CREATE(data_values, data_values_charstrings, records_count);\n    for (int i = 0; i < records_count; i++) {\n        PERSISTENT_CHAR_ARRAY_SET(data_keys, data_keys_charstrings, i, p_data.keys()[i]);\n        PERSISTENT_CHAR_ARRAY_SET(data_values, data_values_charstrings, i, p_data[p_data.keys()[i]]);\n\n        records[i].ApiVersion = EOS_PRESENCE_DATARECORD_API_LATEST;\n        records[i].Key = data_keys[i];\n        records[i].Value = data_values[i];\n    }\n\n    EOS_PresenceModification_SetDataOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_PRESENCEMODIFICATION_SETDATA_API_LATEST;\n    options.RecordsCount = static_cast<int32_t>(records_count);\n    options.Records = records;\n\n    return static_cast<int>(EOS_PresenceModification_SetData(m_internal, &options));\n}\n\nint EOSGPresenceModification::delete_data(Array p_keys) {\n\tERR_FAIL_NULL_V(m_internal, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    int records_count = p_keys.size();\n    EOS_PresenceModification_DataRecordId *records = (EOS_PresenceModification_DataRecordId *)memalloc(sizeof(EOS_PresenceModification_DataRecordId) * records_count);\n\n    PERSISTENT_CHAR_ARRAY_CREATE(data_keys, data_keys_charstrings, records_count)\n    for (int i = 0; i < records_count; i++) {\n        PERSISTENT_CHAR_ARRAY_SET(data_keys, data_keys_charstrings, i, p_keys[i]);\n\n        records[i].ApiVersion = EOS_PRESENCEMODIFICATION_DATARECORDID_API_LATEST;\n        records[i].Key = data_keys[i];\n    }\n\n    EOS_PresenceModification_DeleteDataOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_PRESENCE_DELETEDATA_API_LATEST;\n    options.RecordsCount = records_count;\n    options.Records = records;\n\n    return static_cast<int>(EOS_PresenceModification_DeleteData(m_internal, &options));\n}\n\nint EOSGPresenceModification::set_join_info(const String &p_join_info) {\n\tERR_FAIL_NULL_V(m_internal, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    CharString new_join_info = VARIANT_TO_CHARSTRING(p_join_info);\n\n    EOS_PresenceModification_SetJoinInfoOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_PRESENCEMODIFICATION_SETJOININFO_API_LATEST;\n    options.JoinInfo = new_join_info.get_data();\n\n    return static_cast<int>(EOS_PresenceModification_SetJoinInfo(m_internal, &options));\n}"
  },
  {
    "path": "src/eosg_presence_modification.h",
    "content": "#pragma once\n#include \"eos_presence.h\"\n#include \"godot_cpp/classes/ref_counted.hpp\"\n\nnamespace godot {\n\nclass EOSGPresenceModification : public RefCounted {\n    GDCLASS(EOSGPresenceModification, RefCounted)\n\nprotected:\n    EOS_HPresenceModification m_internal = nullptr;\n    static void _bind_methods();\n\npublic:\n    int delete_data(Array p_keys);\n    int set_data(Dictionary p_data);\n    int set_join_info(const String &p_join_info);\n    int set_raw_rich_text(const String &p_raw_rich_text);\n    int set_status(int new_status);\n\n    EOSGPresenceModification(){};\n    ~EOSGPresenceModification() {\n        if (m_internal != nullptr) {\n            EOS_PresenceModification_Release(m_internal);\n\t\t\tm_internal = nullptr;\n        }\n    };\n\n    void set_internal(EOS_HPresenceModification p_internal) {\n        m_internal = p_internal;\n    }\n\n    EOS_HPresenceModification get_internal() {\n        return m_internal;\n    }\n};\n\n} // namespace godot"
  },
  {
    "path": "src/eosg_session_details.cpp",
    "content": "#include \"eosg_session_details.h\"\n#include \"utils.h\"\nusing namespace godot;\n\nvoid EOSGSessionDetails::_bind_methods() {\n    ClassDB::bind_method(D_METHOD(\"copy_info\"), &EOSGSessionDetails::copy_info);\n    ClassDB::bind_method(D_METHOD(\"copy_session_attribute_by_index\", \"attribute_index\"), &EOSGSessionDetails::copy_session_attribute_by_index);\n    ClassDB::bind_method(D_METHOD(\"copy_session_attribute_by_key\", \"attribute_key\"), &EOSGSessionDetails::copy_session_attribute_by_key);\n    ClassDB::bind_method(D_METHOD(\"get_session_attribute_count\"), &EOSGSessionDetails::get_session_attribute_count);\n}\n\nDictionary EOSGSessionDetails::copy_info() {\n\tERR_FAIL_NULL_V(m_internal, {});\n    EOS_SessionDetails_CopyInfoOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_SESSIONDETAILS_COPYINFO_API_LATEST;\n\n    EOS_SessionDetails_Info *outInfo = nullptr;\n    EOS_EResult res = EOS_SessionDetails_CopyInfo(m_internal, &options, &outInfo);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"info\"] = eosg_sessions_session_details_info_to_dict_and_release(outInfo);\n    return ret;\n}\n\nDictionary EOSGSessionDetails::copy_session_attribute_by_index(int p_attribute_index) {\n\tERR_FAIL_NULL_V(m_internal, {});\n    EOS_SessionDetails_CopySessionAttributeByIndexOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_SESSIONDETAILS_COPYSESSIONATTRIBUTEBYINDEX_API_LATEST;\n    options.AttrIndex = static_cast<uint32_t>(p_attribute_index);\n\n    EOS_SessionDetails_Attribute *outAttr = nullptr;\n    EOS_EResult res = EOS_SessionDetails_CopySessionAttributeByIndex(m_internal, &options, &outAttr);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"attribute\"] = eosg_sessions_session_details_attribute_to_dict_and_release(outAttr);\n    return ret;\n}\n\nDictionary EOSGSessionDetails::copy_session_attribute_by_key(const String &p_attribute_key) {\n\tERR_FAIL_NULL_V(m_internal, {});\n    CharString attribute_key = p_attribute_key.utf8();\n\n    EOS_SessionDetails_CopySessionAttributeByKeyOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_SESSIONDETAILS_COPYSESSIONATTRIBUTEBYKEY_API_LATEST;\n    options.AttrKey = attribute_key.get_data();\n\n    EOS_SessionDetails_Attribute *outAttr = nullptr;\n    EOS_EResult res = EOS_SessionDetails_CopySessionAttributeByKey(m_internal, &options, &outAttr);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"attribute\"] = eosg_sessions_session_details_attribute_to_dict_and_release(outAttr);\n    return ret;\n}\n\nint EOSGSessionDetails::get_session_attribute_count() {\n\tERR_FAIL_NULL_V(m_internal, 0);\n    EOS_SessionDetails_GetSessionAttributeCountOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_SESSIONDETAILS_GETSESSIONATTRIBUTECOUNT_API_LATEST;\n\n    return static_cast<int>(EOS_SessionDetails_GetSessionAttributeCount(m_internal, &options));\n}"
  },
  {
    "path": "src/eosg_session_details.h",
    "content": "#pragma once\n#include \"eos_sessions.h\"\n#include \"godot_cpp/classes/ref_counted.hpp\"\n\nnamespace godot {\n\nclass EOSGSessionDetails : public RefCounted {\n    GDCLASS(EOSGSessionDetails, RefCounted)\n\nprivate:\n    EOS_HSessionDetails m_internal = nullptr;\n    static void _bind_methods();\n\npublic:\n    Dictionary copy_info();\n    Dictionary copy_session_attribute_by_index(int attribute_index);\n    Dictionary copy_session_attribute_by_key(const String &attribute_key);\n    int get_session_attribute_count();\n\n    EOSGSessionDetails(){};\n    ~EOSGSessionDetails() {\n        if (m_internal != nullptr) {\n            EOS_SessionDetails_Release(m_internal);\n\t\t\tm_internal = nullptr;\n        }\n    };\n\n    void set_internal(EOS_HSessionDetails p_internal) {\n        m_internal = p_internal;\n    }\n\n    EOS_HSessionDetails get_internal() {\n        return m_internal;\n    }\n};\n} // namespace godot\n"
  },
  {
    "path": "src/eosg_session_modification.cpp",
    "content": "#include \"eosg_session_modification.h\"\n\n#include \"utils.h\"\nusing namespace godot;\n\nvoid EOSGSessionModification::_bind_methods() {\n    ClassDB::bind_method(D_METHOD(\"add_attribute\", \"key\", \"value\", \"advertisement_type\"), &EOSGSessionModification::add_attribute);\n    ClassDB::bind_method(D_METHOD(\"remove_attribute\", \"key\"), &EOSGSessionModification::remove_attribute);\n    ClassDB::bind_method(D_METHOD(\"set_allowed_platform_ids\", \"allowed_platform_ids\"), &EOSGSessionModification::set_allowed_platform_ids);\n    ClassDB::bind_method(D_METHOD(\"set_bucket_id\", \"bucket_id\"), &EOSGSessionModification::set_bucket_id);\n    ClassDB::bind_method(D_METHOD(\"set_host_address\", \"host_address\"), &EOSGSessionModification::set_host_address);\n    ClassDB::bind_method(D_METHOD(\"set_invites_allowed\", \"invites_allowed\"), &EOSGSessionModification::set_invites_allowed);\n    ClassDB::bind_method(D_METHOD(\"set_max_players\", \"max_players\"), &EOSGSessionModification::set_max_players);\n    ClassDB::bind_method(D_METHOD(\"set_join_in_progress_allowed\", \"join_in_progress_allowed\"), &EOSGSessionModification::set_join_in_progress_allowed);\n    ClassDB::bind_method(D_METHOD(\"set_permission_level\", \"permission_level\"), &EOSGSessionModification::set_permission_level);\n}\n\nint EOSGSessionModification::add_attribute(const String &p_key, Variant p_value, int p_advertisement_type) {\n    ERR_FAIL_NULL_V(m_internal, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    CharString key = p_key.utf8();\n\n    EOS_Sessions_AttributeData sessionAttribute;\n    memset(&sessionAttribute, 0, sizeof(sessionAttribute));\n    sessionAttribute.ApiVersion = EOS_SESSIONS_ATTRIBUTEDATA_API_LATEST;\n    sessionAttribute.Key = key.get_data();\n    CharString value;\n\n    if (p_value.get_type() == Variant::Type::BOOL) {\n        sessionAttribute.ValueType = EOS_ESessionAttributeType::EOS_AT_BOOLEAN;\n        sessionAttribute.Value.AsBool = p_value;\n    } else if (p_value.get_type() == Variant::Type::INT) {\n        sessionAttribute.ValueType = EOS_ESessionAttributeType::EOS_AT_INT64;\n        sessionAttribute.Value.AsInt64 = p_value;\n    } else if (p_value.get_type() == Variant::Type::FLOAT) {\n        sessionAttribute.ValueType = EOS_ESessionAttributeType::EOS_AT_DOUBLE;\n        sessionAttribute.Value.AsDouble = p_value;\n    } else if (p_value.get_type() == Variant::Type::STRING) {\n        value = VARIANT_TO_CHARSTRING(p_value);\n        sessionAttribute.ValueType = EOS_ESessionAttributeType::EOS_AT_STRING;\n        sessionAttribute.Value.AsUtf8 = value.get_data();\n    }\n\n    EOS_SessionModification_AddAttributeOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_SESSIONMODIFICATION_ADDATTRIBUTE_API_LATEST;\n    options.SessionAttribute = &sessionAttribute;\n    options.AdvertisementType = static_cast<EOS_ESessionAttributeAdvertisementType>(p_advertisement_type);\n\n    return static_cast<int>(EOS_SessionModification_AddAttribute(m_internal, &options));\n}\n\nint EOSGSessionModification::remove_attribute(const String &p_key) {\n    ERR_FAIL_NULL_V(m_internal, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    CharString key = p_key.utf8();\n\n    EOS_SessionModification_RemoveAttributeOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_SESSIONMODIFICATION_REMOVEATTRIBUTE_API_LATEST;\n    options.Key = key.get_data();\n\n    return static_cast<int>(EOS_SessionModification_RemoveAttribute(m_internal, &options));\n}\n\nint EOSGSessionModification::set_allowed_platform_ids(const TypedArray<int> &p_platform_ids) {\n    ERR_FAIL_NULL_V(m_internal, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    EOS_SessionModification_SetAllowedPlatformIdsOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_SESSIONMODIFICATION_SETALLOWEDPLATFORMIDS_API_LATEST;\n    options.AllowedPlatformIdsCount = p_platform_ids.size();\n\n    uint32_t *platform_ids_array = (uint32_t *)memalloc(sizeof(uint32_t) * options.AllowedPlatformIdsCount);\n    for (int i = 0; i < options.AllowedPlatformIdsCount; i++) {\n        platform_ids_array[i] = static_cast<uint32_t>(p_platform_ids[i]);\n    }\n    options.AllowedPlatformIds = platform_ids_array;\n\n    int result = static_cast<int>(EOS_SessionModification_SetAllowedPlatformIds(m_internal, &options));\n    memfree(platform_ids_array);\n    return result;\n}\n\nint EOSGSessionModification::set_bucket_id(const String &p_bucket_id) {\n    ERR_FAIL_NULL_V(m_internal, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    CharString bucket_id = p_bucket_id.utf8();\n    EOS_SessionModification_SetBucketIdOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_SESSIONMODIFICATION_SETBUCKETID_API_LATEST;\n    options.BucketId = bucket_id.get_data();\n\n    return static_cast<int>(EOS_SessionModification_SetBucketId(m_internal, &options));\n}\n\nint EOSGSessionModification::set_host_address(const String &p_host_address) {\n    ERR_FAIL_NULL_V(m_internal, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    CharString host_address = p_host_address.utf8();\n    EOS_SessionModification_SetHostAddressOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_SESSIONMODIFICATION_SETHOSTADDRESS_API_LATEST;\n    options.HostAddress = host_address.get_data();\n\n    return static_cast<int>(EOS_SessionModification_SetHostAddress(m_internal, &options));\n}\n\nint EOSGSessionModification::set_invites_allowed(bool p_invites_allowed) {\n    ERR_FAIL_NULL_V(m_internal, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    EOS_SessionModification_SetInvitesAllowedOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_SESSIONMODIFICATION_SETINVITESALLOWED_API_LATEST;\n    options.bInvitesAllowed = p_invites_allowed ? EOS_TRUE : EOS_FALSE;\n\n    return static_cast<int>(EOS_SessionModification_SetInvitesAllowed(m_internal, &options));\n}\n\nint EOSGSessionModification::set_max_players(int p_max_players) {\n    ERR_FAIL_NULL_V(m_internal, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    EOS_SessionModification_SetMaxPlayersOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_SESSIONMODIFICATION_SETMAXPLAYERS_API_LATEST;\n    options.MaxPlayers = static_cast<uint32_t>(p_max_players);\n\n    return static_cast<int>(EOS_SessionModification_SetMaxPlayers(m_internal, &options));\n}\n\nint EOSGSessionModification::set_join_in_progress_allowed(bool p_join_in_progress_allowed) {\n    ERR_FAIL_NULL_V(m_internal, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    EOS_SessionModification_SetJoinInProgressAllowedOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_SESSIONMODIFICATION_SETJOININPROGRESSALLOWED_API_LATEST;\n    options.bAllowJoinInProgress = p_join_in_progress_allowed ? EOS_TRUE : EOS_FALSE;\n\n    return static_cast<int>(EOS_SessionModification_SetJoinInProgressAllowed(m_internal, &options));\n}\n\nint EOSGSessionModification::set_permission_level(int p_permission_level) {\n    ERR_FAIL_NULL_V(m_internal, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    EOS_SessionModification_SetPermissionLevelOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_SESSIONMODIFICATION_SETPERMISSIONLEVEL_API_LATEST;\n    options.PermissionLevel = static_cast<EOS_EOnlineSessionPermissionLevel>(p_permission_level);\n\n    return static_cast<int>(EOS_SessionModification_SetPermissionLevel(m_internal, &options));\n}\n"
  },
  {
    "path": "src/eosg_session_modification.h",
    "content": "#pragma once\n#include \"eos_sessions.h\"\n#include \"godot_cpp/classes/ref_counted.hpp\"\nnamespace godot {\n\nclass EOSGSessionModification : public RefCounted {\n    GDCLASS(EOSGSessionModification, RefCounted)\n\nprivate:\n    EOS_HSessionModification m_internal = nullptr;\n    static void _bind_methods();\n\npublic:\n    int add_attribute(const String &key, Variant value, int advertisement_type);\n    int remove_attribute(const String &key);\n    int set_allowed_platform_ids(const TypedArray<int> &p_platform_ids);\n    int set_bucket_id(const String &bucket_id);\n    int set_host_address(const String &host_address);\n    int set_invites_allowed(bool invites_allowed);\n    int set_join_in_progress_allowed(bool join_in_progress_allowed);\n    int set_max_players(int max_players);\n    int set_permission_level(int permission_level);\n\n    EOSGSessionModification() {};\n    ~EOSGSessionModification() {\n        if (m_internal != nullptr) {\n            EOS_SessionModification_Release(m_internal);\n            m_internal = nullptr;\n        }\n    };\n\n    void set_internal(EOS_HSessionModification p_internal) {\n        m_internal = p_internal;\n    }\n\n    EOS_HSessionModification get_internal() {\n        return m_internal;\n    }\n};\n} // namespace godot\n"
  },
  {
    "path": "src/eosg_session_search.cpp",
    "content": "#include \"eosg_session_search.h\"\n#include \"utils.h\"\n\nusing namespace godot;\n\nvoid EOSGSessionSearch::_bind_methods() {\n    ClassDB::bind_method(D_METHOD(\"copy_search_result_by_index\", \"index\"), &EOSGSessionSearch::copy_search_result_by_index);\n    ClassDB::bind_method(D_METHOD(\"get_search_result_count\"), &EOSGSessionSearch::get_search_result_count);\n    ClassDB::bind_method(D_METHOD(\"remove_parameter\", \"key\", \"comparison_op\"), &EOSGSessionSearch::remove_parameter);\n    ClassDB::bind_method(D_METHOD(\"set_max_results\", \"max_results\"), &EOSGSessionSearch::set_max_results);\n    ClassDB::bind_method(D_METHOD(\"set_parameter\", \"key\", \"value\", \"comparison_op\"), &EOSGSessionSearch::set_parameter);\n    ClassDB::bind_method(D_METHOD(\"set_session_id\", \"session_id\"), &EOSGSessionSearch::set_session_id);\n    ClassDB::bind_method(D_METHOD(\"set_target_user_id\", \"target_user_id\"), &EOSGSessionSearch::set_target_user_id);\n    ClassDB::bind_method(D_METHOD(\"find\", \"local_user_id\"), &EOSGSessionSearch::find);\n}\n\nDictionary EOSGSessionSearch::copy_search_result_by_index(int p_index) {\n\tERR_FAIL_NULL_V(m_internal, {});\n    EOS_SessionSearch_CopySearchResultByIndexOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_SESSIONSEARCH_COPYSEARCHRESULTBYINDEX_API_LATEST;\n    options.SessionIndex = static_cast<uint32_t>(p_index);\n\n    EOS_HSessionDetails outInfo = nullptr;\n    EOS_EResult res = EOS_SessionSearch_CopySearchResultByIndex(m_internal, &options, &outInfo);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"session_details\"] = eosg_sessions_session_details_to_wrapper(outInfo);\n    return ret;\n}\n\nint EOSGSessionSearch::get_search_result_count() {\n\tERR_FAIL_NULL_V(m_internal, 0);\n    EOS_SessionSearch_GetSearchResultCountOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_SESSIONSEARCH_GETSEARCHRESULTCOUNT_API_LATEST;\n\n    int ret = EOS_SessionSearch_GetSearchResultCount(m_internal, &options);\n    return ret;\n}\n\nint EOSGSessionSearch::remove_parameter(const String &p_key, int p_comparison_op) {\n\tERR_FAIL_NULL_V(m_internal, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    CharString key = p_key.utf8();\n\n    EOS_SessionSearch_RemoveParameterOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_SESSIONSEARCH_REMOVEPARAMETER_API_LATEST;\n    options.ComparisonOp = static_cast<EOS_EComparisonOp>(p_comparison_op);\n    options.Key = key.get_data();\n\n    EOS_EResult ret = EOS_SessionSearch_RemoveParameter(m_internal, &options);\n    return static_cast<int>(ret);\n}\n\nint EOSGSessionSearch::set_max_results(int p_max_results) {\n\tERR_FAIL_NULL_V(m_internal, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    EOS_SessionSearch_SetMaxResultsOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_SESSIONSEARCH_SETMAXSEARCHRESULTS_API_LATEST;\n    options.MaxSearchResults = static_cast<uint32_t>(p_max_results);\n\n    EOS_EResult ret = EOS_SessionSearch_SetMaxResults(m_internal, &options);\n    return static_cast<int>(ret);\n}\n\nint EOSGSessionSearch::set_parameter(const String &p_key, Variant p_value, int p_comparison_op) {\n\tERR_FAIL_NULL_V(m_internal, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    CharString key = p_key.utf8();\n\n    EOS_Sessions_AttributeData attributeData;\n    memset(&attributeData, 0, sizeof(attributeData));\n    attributeData.ApiVersion = EOS_SESSIONS_ATTRIBUTEDATA_API_LATEST;\n    attributeData.Key = key.get_data();\n    CharString value;\n\n    if (p_value.get_type() == Variant::Type::BOOL) {\n        attributeData.ValueType = EOS_ESessionAttributeType::EOS_AT_BOOLEAN;\n        attributeData.Value.AsBool = p_value;\n    } else if (p_value.get_type() == Variant::Type::INT) {\n        attributeData.ValueType = EOS_ESessionAttributeType::EOS_AT_INT64;\n        attributeData.Value.AsInt64 = p_value;\n    } else if (p_value.get_type() == Variant::Type::FLOAT) {\n        attributeData.ValueType = EOS_ESessionAttributeType::EOS_AT_DOUBLE;\n        attributeData.Value.AsDouble = p_value;\n    } else if (p_value.get_type() == Variant::Type::STRING) {\n        value = VARIANT_TO_CHARSTRING(p_value);\n        attributeData.ValueType = EOS_ESessionAttributeType::EOS_AT_STRING;\n        attributeData.Value.AsUtf8 = value.get_data();\n    }\n\n    EOS_SessionSearch_SetParameterOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_SESSIONSEARCH_SETPARAMETER_API_LATEST;\n    options.ComparisonOp = static_cast<EOS_EOnlineComparisonOp>(p_comparison_op);\n    options.Parameter = &attributeData;\n\n    return static_cast<int>(EOS_SessionSearch_SetParameter(m_internal, &options));\n}\n\nint EOSGSessionSearch::set_session_id(const String &p_session_id) {\n\tERR_FAIL_NULL_V(m_internal, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    CharString session_id = p_session_id.utf8();\n\n    EOS_SessionSearch_SetSessionIdOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_SESSIONSEARCH_SETSESSIONID_API_LATEST;\n    options.SessionId = session_id.get_data();\n\n    EOS_EResult ret = EOS_SessionSearch_SetSessionId(m_internal, &options);\n    return static_cast<int>(ret);\n}\n\nint EOSGSessionSearch::set_target_user_id(const String &p_target_user_id) {\n\tERR_FAIL_NULL_V(m_internal, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    CharString target_user_id = p_target_user_id.utf8();\n\n    EOS_SessionSearch_SetTargetUserIdOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_SESSIONSEARCH_SETTARGETUSERID_API_LATEST;\n    options.TargetUserId = eosg_string_to_product_user_id(target_user_id.get_data());\n\n    EOS_EResult ret = EOS_SessionSearch_SetTargetUserId(m_internal, &options);\n    return static_cast<int>(ret);\n}\n\nvoid EOSGSessionSearch::find(const String &p_local_user_id) {\n\tERR_FAIL_NULL(m_internal);\n    CharString local_user_id = p_local_user_id.utf8();\n\n    EOS_SessionSearch_FindOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_SESSIONSEARCH_FIND_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n\n    // TODO: Handle passing ClientData if needed\n    EOS_SessionSearch_Find(m_internal, &options, nullptr, [](const EOS_SessionSearch_FindCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        ret[\"client_data\"] = Variant();\n        IEOS::get_singleton()->emit_signal(\"session_search_find_callback\", ret);\n    });\n}"
  },
  {
    "path": "src/eosg_session_search.h",
    "content": "#pragma once\n#include \"eos_sessions.h\"\n#include \"godot_cpp/classes/ref_counted.hpp\"\n\nnamespace godot {\n\nclass EOSGSessionSearch : public RefCounted {\n    GDCLASS(EOSGSessionSearch, RefCounted)\n\nprivate:\n    EOS_HSessionSearch m_internal = nullptr;\n    static void _bind_methods();\n\npublic:\n    Dictionary copy_search_result_by_index(int index);\n    int get_search_result_count();\n    int remove_parameter(const String &key, int comparison_op);\n    int set_max_results(int max_results);\n    int set_parameter(const String &key, Variant value, int comparison_op);\n    int set_session_id(const String &session_id);\n    int set_target_user_id(const String &target_user_id);\n    void find(const String &local_user_id);\n\n    EOSGSessionSearch(){};\n    ~EOSGSessionSearch() {\n        if (m_internal != nullptr) {\n            EOS_SessionSearch_Release(m_internal);\n\t\t\tm_internal = nullptr;\n        }\n    };\n\n    void set_internal(EOS_HSessionSearch p_internal) {\n        m_internal = p_internal;\n    }\n\n    EOS_HSessionSearch get_internal() {\n        return m_internal;\n    }\n};\n} // namespace godot\n"
  },
  {
    "path": "src/eosg_titlestorage_file_transfer_request.cpp",
    "content": "#include \"eosg_titlestorage_file_transfer_request.h\"\n#include \"eos_titlestorage.h\"\n#include \"utils.h\"\n\nusing namespace godot;\n\nvoid EOSGTitleStorageFileTransferRequest::_bind_methods() {\n    ClassDB::bind_method(D_METHOD(\"get_file_request_state\"), &EOSGTitleStorageFileTransferRequest::get_file_request_state);\n    ClassDB::bind_method(D_METHOD(\"get_filename\"), &EOSGTitleStorageFileTransferRequest::get_filename);\n    ClassDB::bind_method(D_METHOD(\"cancel_request\"), &EOSGTitleStorageFileTransferRequest::cancel_request);\n\n    ADD_SIGNAL(MethodInfo(\"file_transfer_progress_callback\", PropertyInfo(Variant::DICTIONARY, \"callback_data\")));\n}\n\nint EOSGTitleStorageFileTransferRequest::get_file_request_state() {\n    ERR_FAIL_NULL_V(m_internal, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    return static_cast<int>(EOS_TitleStorageFileTransferRequest_GetFileRequestState(m_internal));\n}\n\nDictionary EOSGTitleStorageFileTransferRequest::get_filename() {\n    ERR_FAIL_NULL_V(m_internal, {});\n    char *outBuffer = (char *)(memalloc(EOS_TITLESTORAGE_FILENAME_MAX_LENGTH_BYTES + 1));\n    int outBufferLength = EOS_TITLESTORAGE_FILENAME_MAX_LENGTH_BYTES + 1;\n    EOS_EResult result = EOS_TitleStorageFileTransferRequest_GetFilename(m_internal, EOS_TITLESTORAGE_FILENAME_MAX_LENGTH_BYTES + 1, outBuffer, &outBufferLength);\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(result);\n    ret[\"filename\"] = EOSG_GET_STRING(outBuffer);\n    memfree(outBuffer);\n    return ret;\n}\n\nint EOSGTitleStorageFileTransferRequest::cancel_request() {\n    ERR_FAIL_NULL_V(m_internal, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    return static_cast<int>(EOS_TitleStorageFileTransferRequest_CancelRequest(m_internal));\n}"
  },
  {
    "path": "src/eosg_titlestorage_file_transfer_request.h",
    "content": "#pragma once\n#include \"eos_titlestorage.h\"\n#include \"eosg_file_transfer_request.h\"\n#include \"godot_cpp/classes/ref_counted.hpp\"\n\nnamespace godot {\n\nclass EOSGTitleStorageFileTransferRequest : public EOSGFileTransferRequest {\n    GDCLASS(EOSGTitleStorageFileTransferRequest, EOSGFileTransferRequest)\n\nprivate:\n    EOS_HTitleStorageFileTransferRequest m_internal = nullptr;\n    static void _bind_methods();\n\npublic:\n    Dictionary get_filename() override;\n    int cancel_request() override;\n    int get_file_request_state() override;\n\n    EOSGTitleStorageFileTransferRequest(){};\n    ~EOSGTitleStorageFileTransferRequest() {\n        if (m_internal != nullptr) {\n            EOS_TitleStorageFileTransferRequest_Release(m_internal);\n\t\t\tm_internal = nullptr;\n        }\n    }\n\n    void set_internal(EOS_HTitleStorageFileTransferRequest p_internal) {\n        m_internal = p_internal;\n    }\n\n    EOS_HTitleStorageFileTransferRequest get_internal() {\n        return m_internal;\n    }\n};\n\n} //namespace godot\n"
  },
  {
    "path": "src/eosg_transaction.cpp",
    "content": "#include \"eosg_transaction.h\"\n\n#include \"utils.h\"\n\nusing namespace godot;\n\nvoid EOSGTransaction::_bind_methods() {\n    ClassDB::bind_method(D_METHOD(\"get_id\"), &EOSGTransaction::get_id);\n    ClassDB::bind_method(D_METHOD(\"get_entitlement_count\"), &EOSGTransaction::get_entitlement_count);\n    ClassDB::bind_method(D_METHOD(\"copy_entitlement_by_index\", \"entitlement_index\"), &EOSGTransaction::copy_entitlement_by_index);\n};\n\nString EOSGTransaction::get_id() {\n    ERR_FAIL_NULL_V(m_internal, \"\");\n    char *outBuffer = (char *)memalloc(256);\n    int32_t outLength = 0;\n    EOS_Ecom_Transaction_GetTransactionId(m_internal, outBuffer, &outLength);\n    return String(outBuffer);\n}\n\nint EOSGTransaction::get_entitlement_count() {\n    ERR_FAIL_NULL_V(m_internal, 0);\n    EOS_Ecom_Transaction_GetEntitlementsCountOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ECOM_TRANSACTION_GETENTITLEMENTSCOUNT_API_LATEST;\n\n    return static_cast<int>(EOS_Ecom_Transaction_GetEntitlementsCount(m_internal, &options));\n}\n\nDictionary EOSGTransaction::copy_entitlement_by_index(int p_entitlement_index) {\n    ERR_FAIL_NULL_V(m_internal, {});\n    EOS_Ecom_Transaction_CopyEntitlementByIndexOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_ECOM_TRANSACTION_COPYENTITLEMENTBYINDEX_API_LATEST;\n    options.EntitlementIndex = static_cast<uint32_t>(p_entitlement_index);\n\n    EOS_Ecom_Entitlement *outEntitlement;\n    EOS_EResult res = EOS_Ecom_Transaction_CopyEntitlementByIndex(m_internal, &options, &outEntitlement);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"entitlement\"] = eosg_ecom_entitlement_to_dict_and_release(outEntitlement);\n    return ret;\n}"
  },
  {
    "path": "src/eosg_transaction.h",
    "content": "#pragma once\n#include \"eos_ecom.h\"\n#include \"godot_cpp/classes/ref_counted.hpp\"\n\nnamespace godot {\n\nclass EOSGTransaction : public RefCounted {\n    GDCLASS(EOSGTransaction, RefCounted)\n\nprotected:\n    EOS_Ecom_HTransaction m_internal = nullptr;\n    static void _bind_methods();\n\npublic:\n    Dictionary copy_entitlement_by_index(int p_entitlement_index);\n    int get_entitlement_count();\n    String get_id();\n\n    EOSGTransaction(){};\n    ~EOSGTransaction() {\n        if (m_internal != nullptr) {\n            EOS_Ecom_Transaction_Release(m_internal);\n\t\t\tm_internal = nullptr;\n        }\n    };\n\n    void set_internal(EOS_Ecom_HTransaction p_internal) {\n        m_internal = p_internal;\n    }\n\n    EOS_Ecom_HTransaction get_internal() {\n        return m_internal;\n    }\n};\n} // namespace godot"
  },
  {
    "path": "src/friends_interface.cpp",
    "content": "#include \"ieos.h\"\nusing namespace std;\n\nvoid IEOS::friends_interface_accept_invite(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_friendsInterface);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString target_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"target_user_id\"));\n\n    EOS_Friends_AcceptInviteOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_FRIENDS_ACCEPTINVITE_API_LATEST;\n    options.LocalUserId = eosg_string_to_epic_account_id(local_user_id.get_data());\n    options.TargetUserId = eosg_string_to_epic_account_id(target_user_id.get_data());\n    p_options->reference();\n\n    EOS_Friends_AcceptInvite(s_friendsInterface, &options, (void *)*p_options, [](const EOS_Friends_AcceptInviteCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"local_user_id\"] = eosg_epic_account_id_to_string(data->LocalUserId);\n        ret[\"target_user_id\"] = eosg_epic_account_id_to_string(data->TargetUserId);\n        IEOS::get_singleton()->emit_signal(\"friends_interface_accept_invite_callback\", ret);\n    });\n}\n\nString IEOS::friends_interface_get_friend_at_index(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_friendsInterface, \"\");\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n\n    EOS_Friends_GetFriendAtIndexOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_FRIENDS_GETFRIENDATINDEX_API_LATEST;\n    options.LocalUserId = eosg_string_to_epic_account_id(local_user_id.get_data());\n    options.Index = static_cast<int32_t>(p_options->get(\"index\"));\n\n    return eosg_epic_account_id_to_string(EOS_Friends_GetFriendAtIndex(s_friendsInterface, &options));\n}\n\nint IEOS::friends_interface_get_friends_count(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_friendsInterface, 0);\n\tCharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n\n    EOS_Friends_GetFriendsCountOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_FRIENDS_GETFRIENDSCOUNT_API_LATEST;\n    options.LocalUserId = eosg_string_to_epic_account_id(local_user_id.get_data());\n\n    return static_cast<int>(EOS_Friends_GetFriendsCount(s_friendsInterface, &options));\n}\n\nint IEOS::friends_interface_get_status(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_friendsInterface, static_cast<int>(EOS_EFriendsStatus::EOS_FS_NotFriends));\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString target_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"target_user_id\"));\n\n    EOS_Friends_GetStatusOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_FRIENDS_GETSTATUS_API_LATEST;\n    options.LocalUserId = eosg_string_to_epic_account_id(local_user_id.get_data());\n    options.TargetUserId = eosg_string_to_epic_account_id(target_user_id.get_data());\n\n    return static_cast<int>(EOS_Friends_GetStatus(s_friendsInterface, &options));\n}\n\nvoid IEOS::friends_interface_query_friends(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_friendsInterface);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n\n    EOS_Friends_QueryFriendsOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_FRIENDS_QUERYFRIENDS_API_LATEST;\n    options.LocalUserId = eosg_string_to_epic_account_id(local_user_id.get_data());\n    p_options->reference();\n\n    EOS_Friends_QueryFriends(s_friendsInterface, &options, (void *)*p_options, [](const EOS_Friends_QueryFriendsCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"local_user_id\"] = eosg_epic_account_id_to_string(data->LocalUserId);\n        IEOS::get_singleton()->emit_signal(\"friends_interface_query_friends_callback\", ret);\n    });\n}\n\nvoid IEOS::friends_interface_reject_invite(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_friendsInterface);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString target_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"target_user_id\"));\n\n    EOS_Friends_RejectInviteOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_FRIENDS_REJECTINVITE_API_LATEST;\n    options.LocalUserId = eosg_string_to_epic_account_id(local_user_id.get_data());\n    options.TargetUserId = eosg_string_to_epic_account_id(target_user_id.get_data());\n    p_options->reference();\n\n    EOS_Friends_RejectInvite(s_friendsInterface, &options, (void *)*p_options, [](const EOS_Friends_RejectInviteCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"local_user_id\"] = eosg_epic_account_id_to_string(data->LocalUserId);\n        ret[\"target_user_id\"] = eosg_epic_account_id_to_string(data->TargetUserId);\n        IEOS::get_singleton()->emit_signal(\"friends_interface_reject_invite_callback\", ret);\n    });\n}\n\nvoid IEOS::friends_interface_send_invite(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_friendsInterface);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString target_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"target_user_id\"));\n\n    EOS_Friends_SendInviteOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_FRIENDS_SENDINVITE_API_LATEST;\n    options.LocalUserId = eosg_string_to_epic_account_id(local_user_id.get_data());\n    options.TargetUserId = eosg_string_to_epic_account_id(target_user_id.get_data());\n    p_options->reference();\n\n    EOS_Friends_SendInvite(s_friendsInterface, &options, (void *)*p_options, [](const EOS_Friends_SendInviteCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"local_user_id\"] = eosg_epic_account_id_to_string(data->LocalUserId);\n        ret[\"target_user_id\"] = eosg_epic_account_id_to_string(data->TargetUserId);\n        IEOS::get_singleton()->emit_signal(\"friends_interface_send_invite_callback\", ret);\n    });\n}\n\nint IEOS::friends_interface_get_blocked_users_count(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_friendsInterface, 0);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n\n    EOS_Friends_GetBlockedUsersCountOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_FRIENDS_GETBLOCKEDUSERSCOUNT_API_LATEST;\n    options.LocalUserId = eosg_string_to_epic_account_id(local_user_id.get_data());\n\n    return static_cast<int>(EOS_Friends_GetBlockedUsersCount(s_friendsInterface, &options));\n}\n\nString IEOS::friends_interface_get_blocked_user_at_index(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_friendsInterface, \"\");\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    int index = static_cast<int>(p_options->get(\"index\"));\n\n    EOS_Friends_GetBlockedUserAtIndexOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_FRIENDS_GETBLOCKEDUSERATINDEX_API_LATEST;\n    options.LocalUserId = eosg_string_to_epic_account_id(local_user_id.get_data());\n    options.Index = static_cast<int32_t>(index);\n\n    return eosg_epic_account_id_to_string(EOS_Friends_GetBlockedUserAtIndex(s_friendsInterface, &options));\n}"
  },
  {
    "path": "src/ieos.cpp",
    "content": "#include \"ieos.h\"\n\nusing namespace godot;\n\n#define IEOS_BIND_METHOD(m_name) ClassDB::bind_method(D_METHOD(#m_name), &IEOS::m_name)\n#define IEOS_BIND_SIGNAL(m_name) ADD_SIGNAL(MethodInfo(#m_name, PropertyInfo(Variant::DICTIONARY, \"callback_data\")))\n\nvoid IEOS::_bind_methods() {\n    ClassDB::bind_static_method(\"IEOS\", D_METHOD(\"tick\"), &IEOS::tick);\n    IEOS_BIND_METHOD(is_operation_complete);\n\n    // EOS Methods\n    IEOS_BIND_METHOD(achievements_interface_copy_achievement_definition_v2_by_achievement_id);\n    IEOS_BIND_METHOD(achievements_interface_copy_achievement_definition_v2_by_index);\n    IEOS_BIND_METHOD(achievements_interface_copy_player_achievement_by_achievement_id);\n    IEOS_BIND_METHOD(achievements_interface_copy_player_achievement_by_index);\n    IEOS_BIND_METHOD(achievements_interface_get_achievement_definition_count);\n    IEOS_BIND_METHOD(achievements_interface_get_player_achievement_count);\n    IEOS_BIND_METHOD(achievements_interface_query_definitions);\n    IEOS_BIND_METHOD(achievements_interface_query_player_achievements);\n    IEOS_BIND_METHOD(achievements_interface_unlock_achievements);\n    IEOS_BIND_METHOD(auth_interface_copy_id_token);\n    IEOS_BIND_METHOD(auth_interface_copy_user_auth_token);\n    IEOS_BIND_METHOD(auth_interface_delete_persistent_auth);\n    IEOS_BIND_METHOD(auth_interface_get_logged_in_account_by_index);\n    IEOS_BIND_METHOD(auth_interface_get_logged_in_accounts_count);\n    IEOS_BIND_METHOD(auth_interface_get_login_status);\n    IEOS_BIND_METHOD(auth_interface_get_merged_account_by_index);\n    IEOS_BIND_METHOD(auth_interface_get_merged_accounts_count);\n    IEOS_BIND_METHOD(auth_interface_get_selected_account_id);\n    IEOS_BIND_METHOD(auth_interface_link_account);\n    IEOS_BIND_METHOD(auth_interface_login);\n    IEOS_BIND_METHOD(auth_interface_logout);\n    IEOS_BIND_METHOD(auth_interface_query_id_token);\n    IEOS_BIND_METHOD(auth_interface_verify_id_token);\n    IEOS_BIND_METHOD(auth_interface_verify_user_auth);\n    IEOS_BIND_METHOD(connect_interface_copy_id_token);\n    IEOS_BIND_METHOD(connect_interface_copy_product_user_external_account_by_account_id);\n    IEOS_BIND_METHOD(connect_interface_copy_product_user_external_account_by_account_type);\n    IEOS_BIND_METHOD(connect_interface_copy_product_user_external_account_by_index);\n    IEOS_BIND_METHOD(connect_interface_copy_product_user_info);\n    IEOS_BIND_METHOD(connect_interface_create_device_id);\n    IEOS_BIND_METHOD(connect_interface_create_user);\n    IEOS_BIND_METHOD(connect_interface_delete_device_id);\n    IEOS_BIND_METHOD(connect_interface_get_external_account_mapping);\n    IEOS_BIND_METHOD(connect_interface_get_logged_in_user_by_index);\n    IEOS_BIND_METHOD(connect_interface_get_logged_in_users_count);\n    IEOS_BIND_METHOD(connect_interface_get_login_status);\n    IEOS_BIND_METHOD(connect_interface_get_product_user_external_account_count);\n    IEOS_BIND_METHOD(connect_interface_get_product_user_id_mapping);\n    IEOS_BIND_METHOD(connect_interface_link_account);\n    IEOS_BIND_METHOD(connect_interface_login);\n    IEOS_BIND_METHOD(connect_interface_logout);\n    IEOS_BIND_METHOD(connect_interface_query_external_account_mappings);\n    IEOS_BIND_METHOD(connect_interface_query_product_user_id_mappings);\n    IEOS_BIND_METHOD(connect_interface_transfer_device_id_account);\n    IEOS_BIND_METHOD(connect_interface_unlink_account);\n    IEOS_BIND_METHOD(connect_interface_verify_id_token);\n    IEOS_BIND_METHOD(custom_invites_interface_accept_request_to_join);\n    IEOS_BIND_METHOD(custom_invites_interface_finalize_invite);\n    IEOS_BIND_METHOD(custom_invites_interface_reject_request_to_join);\n    IEOS_BIND_METHOD(custom_invites_interface_send_custom_invite);\n    IEOS_BIND_METHOD(custom_invites_interface_send_request_to_join);\n    IEOS_BIND_METHOD(custom_invites_interface_set_custom_invite);\n    IEOS_BIND_METHOD(ecom_interface_checkout);\n    IEOS_BIND_METHOD(ecom_interface_copy_entitlement_by_id);\n    IEOS_BIND_METHOD(ecom_interface_copy_entitlement_by_index);\n    IEOS_BIND_METHOD(ecom_interface_copy_entitlement_by_name_and_index);\n    IEOS_BIND_METHOD(ecom_interface_copy_item_by_id);\n    IEOS_BIND_METHOD(ecom_interface_copy_item_image_info_by_index);\n    IEOS_BIND_METHOD(ecom_interface_copy_item_release_by_index);\n    IEOS_BIND_METHOD(ecom_interface_copy_last_redeemed_entitlement_by_index);\n    IEOS_BIND_METHOD(ecom_interface_copy_offer_by_id);\n    IEOS_BIND_METHOD(ecom_interface_copy_offer_by_index);\n    IEOS_BIND_METHOD(ecom_interface_copy_offer_image_info_by_index);\n    IEOS_BIND_METHOD(ecom_interface_copy_offer_item_by_index);\n    IEOS_BIND_METHOD(ecom_interface_copy_transaction_by_id);\n    IEOS_BIND_METHOD(ecom_interface_copy_transaction_by_index);\n    IEOS_BIND_METHOD(ecom_interface_get_entitlements_by_name_count);\n    IEOS_BIND_METHOD(ecom_interface_get_entitlements_count);\n    IEOS_BIND_METHOD(ecom_interface_get_item_image_info_count);\n    IEOS_BIND_METHOD(ecom_interface_get_item_release_count);\n    IEOS_BIND_METHOD(ecom_interface_get_last_redeemed_entitlements_count);\n    IEOS_BIND_METHOD(ecom_interface_get_offer_count);\n    IEOS_BIND_METHOD(ecom_interface_get_offer_image_info_count);\n    IEOS_BIND_METHOD(ecom_interface_get_offer_item_count);\n    IEOS_BIND_METHOD(ecom_interface_get_transaction_count);\n    IEOS_BIND_METHOD(ecom_interface_query_entitlement_token);\n    IEOS_BIND_METHOD(ecom_interface_query_entitlements);\n    IEOS_BIND_METHOD(ecom_interface_query_offers);\n    IEOS_BIND_METHOD(ecom_interface_query_ownership);\n    IEOS_BIND_METHOD(ecom_interface_query_ownership_by_sandbox_ids);\n    IEOS_BIND_METHOD(ecom_interface_query_ownership_token);\n    IEOS_BIND_METHOD(ecom_interface_redeem_entitlements);\n    IEOS_BIND_METHOD(friends_interface_accept_invite);\n    IEOS_BIND_METHOD(friends_interface_get_blocked_user_at_index);\n    IEOS_BIND_METHOD(friends_interface_get_blocked_users_count);\n    IEOS_BIND_METHOD(friends_interface_get_friend_at_index);\n    IEOS_BIND_METHOD(friends_interface_get_friends_count);\n    IEOS_BIND_METHOD(friends_interface_get_status);\n    IEOS_BIND_METHOD(friends_interface_query_friends);\n    IEOS_BIND_METHOD(friends_interface_reject_invite);\n    IEOS_BIND_METHOD(friends_interface_send_invite);\n    IEOS_BIND_METHOD(kws_interface_copy_permission_by_index);\n    IEOS_BIND_METHOD(kws_interface_create_user);\n    IEOS_BIND_METHOD(kws_interface_get_permission_by_key);\n    IEOS_BIND_METHOD(kws_interface_get_permissions_count);\n    IEOS_BIND_METHOD(kws_interface_query_age_gate);\n    IEOS_BIND_METHOD(kws_interface_query_permissions);\n    IEOS_BIND_METHOD(kws_interface_request_permissions);\n    IEOS_BIND_METHOD(kws_interface_update_parent_email);\n    IEOS_BIND_METHOD(leaderboards_interface_copy_leaderboard_definition_by_index);\n    IEOS_BIND_METHOD(leaderboards_interface_copy_leaderboard_definition_by_leaderboard_id);\n    IEOS_BIND_METHOD(leaderboards_interface_copy_leaderboard_record_by_index);\n    IEOS_BIND_METHOD(leaderboards_interface_copy_leaderboard_record_by_user_id);\n    IEOS_BIND_METHOD(leaderboards_interface_copy_leaderboard_user_score_by_index);\n    IEOS_BIND_METHOD(leaderboards_interface_copy_leaderboard_user_score_by_user_id);\n    IEOS_BIND_METHOD(leaderboards_interface_get_leaderboard_definition_count);\n    IEOS_BIND_METHOD(leaderboards_interface_get_leaderboard_record_count);\n    IEOS_BIND_METHOD(leaderboards_interface_get_leaderboard_user_score_count);\n    IEOS_BIND_METHOD(leaderboards_interface_query_leaderboard_definitions);\n    IEOS_BIND_METHOD(leaderboards_interface_query_leaderboard_ranks);\n    IEOS_BIND_METHOD(leaderboards_interface_query_leaderboard_user_scores);\n    IEOS_BIND_METHOD(lobby_interface_copy_lobby_details);\n    IEOS_BIND_METHOD(lobby_interface_copy_lobby_details_by_invite_id);\n    IEOS_BIND_METHOD(lobby_interface_copy_lobby_details_by_ui_event_id);\n    IEOS_BIND_METHOD(lobby_interface_create_lobby);\n    IEOS_BIND_METHOD(lobby_interface_create_lobby_search);\n    IEOS_BIND_METHOD(lobby_interface_destroy_lobby);\n    IEOS_BIND_METHOD(lobby_interface_get_connect_string);\n    IEOS_BIND_METHOD(lobby_interface_get_invite_count);\n    IEOS_BIND_METHOD(lobby_interface_get_invite_id_by_index);\n    IEOS_BIND_METHOD(lobby_interface_get_rtc_room_name);\n    IEOS_BIND_METHOD(lobby_interface_hard_mute_member);\n    IEOS_BIND_METHOD(lobby_interface_is_rtc_room_connected);\n    IEOS_BIND_METHOD(lobby_interface_join_lobby);\n    IEOS_BIND_METHOD(lobby_interface_join_lobby_by_id);\n    IEOS_BIND_METHOD(lobby_interface_kick_member);\n    IEOS_BIND_METHOD(lobby_interface_leave_lobby);\n    IEOS_BIND_METHOD(lobby_interface_parse_connect_string);\n    IEOS_BIND_METHOD(lobby_interface_promote_member);\n    IEOS_BIND_METHOD(lobby_interface_query_invites);\n    IEOS_BIND_METHOD(lobby_interface_reject_invite);\n    IEOS_BIND_METHOD(lobby_interface_send_invite);\n    IEOS_BIND_METHOD(lobby_interface_update_lobby);\n    IEOS_BIND_METHOD(lobby_interface_update_lobby_modification);\n    IEOS_BIND_METHOD(logging_interface_set_log_level);\n    IEOS_BIND_METHOD(metrics_interface_begin_player_session);\n    IEOS_BIND_METHOD(metrics_interface_end_player_session);\n    IEOS_BIND_METHOD(mods_interface_copy_mod_info);\n    IEOS_BIND_METHOD(mods_interface_enumerate_mods);\n    IEOS_BIND_METHOD(mods_interface_install_mod);\n    IEOS_BIND_METHOD(mods_interface_uninstall_mod);\n    IEOS_BIND_METHOD(mods_interface_update_mod);\n    IEOS_BIND_METHOD(p2p_interface_get_nat_type);\n    IEOS_BIND_METHOD(p2p_interface_get_packet_queue_info);\n    IEOS_BIND_METHOD(p2p_interface_get_port_range);\n    IEOS_BIND_METHOD(p2p_interface_get_relay_control);\n    IEOS_BIND_METHOD(p2p_interface_query_nat_type);\n    IEOS_BIND_METHOD(p2p_interface_set_packet_queue_size);\n    IEOS_BIND_METHOD(p2p_interface_set_port_range);\n    IEOS_BIND_METHOD(p2p_interface_set_relay_control);\n    IEOS_BIND_METHOD(platform_interface_check_for_launcher_and_restart);\n    IEOS_BIND_METHOD(platform_interface_create);\n    IEOS_BIND_METHOD(platform_interface_get_active_country_code);\n    IEOS_BIND_METHOD(platform_interface_get_active_locale_code);\n    IEOS_BIND_METHOD(platform_interface_get_application_status);\n    IEOS_BIND_METHOD(platform_interface_get_desktop_crossplay_status_info);\n    IEOS_BIND_METHOD(platform_interface_get_network_status);\n    IEOS_BIND_METHOD(platform_interface_get_override_country_code);\n    IEOS_BIND_METHOD(platform_interface_get_override_locale_code);\n    IEOS_BIND_METHOD(platform_interface_initialize);\n    IEOS_BIND_METHOD(platform_interface_release);\n    IEOS_BIND_METHOD(platform_interface_set_application_status);\n    IEOS_BIND_METHOD(platform_interface_set_network_status);\n    IEOS_BIND_METHOD(platform_interface_set_override_country_code);\n    IEOS_BIND_METHOD(platform_interface_set_override_locale_code);\n    IEOS_BIND_METHOD(platform_interface_shutdown);\n    IEOS_BIND_METHOD(playerdatastorage_interface_copy_file_metadata_at_index);\n    IEOS_BIND_METHOD(playerdatastorage_interface_copy_file_metadata_by_filename);\n    IEOS_BIND_METHOD(playerdatastorage_interface_delete_cache);\n    IEOS_BIND_METHOD(playerdatastorage_interface_delete_file);\n    IEOS_BIND_METHOD(playerdatastorage_interface_duplicate_file);\n    IEOS_BIND_METHOD(playerdatastorage_interface_get_file_metadata_count);\n    IEOS_BIND_METHOD(playerdatastorage_interface_query_file);\n    IEOS_BIND_METHOD(playerdatastorage_interface_query_file_list);\n    IEOS_BIND_METHOD(playerdatastorage_interface_read_file);\n    IEOS_BIND_METHOD(playerdatastorage_interface_write_file);\n    IEOS_BIND_METHOD(presence_interface_copy_presence);\n    IEOS_BIND_METHOD(presence_interface_create_presence_modification);\n    IEOS_BIND_METHOD(presence_interface_get_join_info);\n    IEOS_BIND_METHOD(presence_interface_has_presence);\n    IEOS_BIND_METHOD(presence_interface_query_presence);\n    IEOS_BIND_METHOD(presence_interface_set_presence);\n    IEOS_BIND_METHOD(progression_snapshot_interface_add_progression);\n    IEOS_BIND_METHOD(progression_snapshot_interface_begin_snapshot);\n    IEOS_BIND_METHOD(progression_snapshot_interface_delete_snapshot);\n    IEOS_BIND_METHOD(progression_snapshot_interface_end_snapshot);\n    IEOS_BIND_METHOD(progression_snapshot_interface_submit_snapshot);\n    IEOS_BIND_METHOD(reports_interface_send_player_behavior_report);\n    IEOS_BIND_METHOD(rtc_audio_interface_add_notify_audio_before_render);\n    IEOS_BIND_METHOD(rtc_audio_interface_add_notify_audio_before_send);\n    IEOS_BIND_METHOD(rtc_audio_interface_add_notify_audio_input_state);\n    IEOS_BIND_METHOD(rtc_audio_interface_add_notify_audio_output_state);\n    IEOS_BIND_METHOD(rtc_audio_interface_add_notify_participant_updated);\n    IEOS_BIND_METHOD(rtc_audio_interface_copy_input_device_information_by_index);\n    IEOS_BIND_METHOD(rtc_audio_interface_copy_output_device_information_by_index);\n    IEOS_BIND_METHOD(rtc_audio_interface_get_input_devices_count);\n    IEOS_BIND_METHOD(rtc_audio_interface_get_output_devices_count);\n    IEOS_BIND_METHOD(rtc_audio_interface_query_input_devices_information);\n    IEOS_BIND_METHOD(rtc_audio_interface_query_output_devices_information);\n    IEOS_BIND_METHOD(rtc_audio_interface_register_platform_user);\n    IEOS_BIND_METHOD(rtc_audio_interface_remove_notify_audio_before_render);\n    IEOS_BIND_METHOD(rtc_audio_interface_remove_notify_audio_before_send);\n    IEOS_BIND_METHOD(rtc_audio_interface_remove_notify_audio_input_state);\n    IEOS_BIND_METHOD(rtc_audio_interface_remove_notify_audio_output_state);\n    IEOS_BIND_METHOD(rtc_audio_interface_remove_notify_participant_updated);\n    IEOS_BIND_METHOD(rtc_audio_interface_send_audio);\n    IEOS_BIND_METHOD(rtc_audio_interface_set_input_device_settings);\n    IEOS_BIND_METHOD(rtc_audio_interface_set_output_device_settings);\n    IEOS_BIND_METHOD(rtc_audio_interface_unregister_platform_user);\n    IEOS_BIND_METHOD(rtc_audio_interface_update_participant_volume);\n    IEOS_BIND_METHOD(rtc_audio_interface_update_receiving);\n    IEOS_BIND_METHOD(rtc_audio_interface_update_receiving_volume);\n    IEOS_BIND_METHOD(rtc_audio_interface_update_sending);\n    IEOS_BIND_METHOD(rtc_audio_interface_update_sending_volume);\n    IEOS_BIND_METHOD(rtc_data_interface_add_notify_data_received);\n    IEOS_BIND_METHOD(rtc_data_interface_add_notify_participant_updated);\n    IEOS_BIND_METHOD(rtc_data_interface_send_data);\n    IEOS_BIND_METHOD(rtc_data_interface_remove_notify_data_received);\n    IEOS_BIND_METHOD(rtc_data_interface_remove_notify_participant_updated);\n    IEOS_BIND_METHOD(rtc_data_interface_update_receiving);\n    IEOS_BIND_METHOD(rtc_data_interface_update_sending);\n    IEOS_BIND_METHOD(rtc_interface_add_notify_disconnected);\n    IEOS_BIND_METHOD(rtc_interface_add_notify_participant_status_changed);\n    IEOS_BIND_METHOD(rtc_interface_add_notify_room_statistics_updated);\n    IEOS_BIND_METHOD(rtc_interface_block_participant);\n    IEOS_BIND_METHOD(rtc_interface_join_room);\n    IEOS_BIND_METHOD(rtc_interface_leave_room);\n    IEOS_BIND_METHOD(rtc_interface_remove_notify_disconnected);\n    IEOS_BIND_METHOD(rtc_interface_remove_notify_participant_status_changed);\n    IEOS_BIND_METHOD(rtc_interface_remove_notify_room_statistics_updated);\n    IEOS_BIND_METHOD(rtc_interface_set_room_setting);\n    IEOS_BIND_METHOD(rtc_interface_set_setting);\n    IEOS_BIND_METHOD(sanctions_interface_copy_player_sanction_by_index);\n    IEOS_BIND_METHOD(sanctions_interface_get_player_sanction_count);\n    IEOS_BIND_METHOD(sanctions_interface_query_active_player_sanctions);\n    IEOS_BIND_METHOD(sanctions_interface_create_player_sanction_appeal);\n    IEOS_BIND_METHOD(sessions_interface_copy_active_session_details);\n    IEOS_BIND_METHOD(sessions_interface_copy_session_details_by_invite_id);\n    IEOS_BIND_METHOD(sessions_interface_copy_session_details_by_ui_event_id);\n    IEOS_BIND_METHOD(sessions_interface_copy_session_details_for_presence);\n    IEOS_BIND_METHOD(sessions_interface_create_session_modification);\n    IEOS_BIND_METHOD(sessions_interface_create_session_search);\n    IEOS_BIND_METHOD(sessions_interface_destroy_session);\n    IEOS_BIND_METHOD(sessions_interface_dump_session_state);\n    IEOS_BIND_METHOD(sessions_interface_end_session);\n    IEOS_BIND_METHOD(sessions_interface_get_invite_count);\n    IEOS_BIND_METHOD(sessions_interface_get_invite_id_by_index);\n    IEOS_BIND_METHOD(sessions_interface_is_user_in_session);\n    IEOS_BIND_METHOD(sessions_interface_join_session);\n    IEOS_BIND_METHOD(sessions_interface_query_invites);\n    IEOS_BIND_METHOD(sessions_interface_register_players);\n    IEOS_BIND_METHOD(sessions_interface_reject_invite);\n    IEOS_BIND_METHOD(sessions_interface_send_invite);\n    IEOS_BIND_METHOD(sessions_interface_start_session);\n    IEOS_BIND_METHOD(sessions_interface_unregister_players);\n    IEOS_BIND_METHOD(sessions_interface_update_session);\n    IEOS_BIND_METHOD(sessions_interface_update_session_modification);\n    IEOS_BIND_METHOD(stats_interface_copy_stat_by_index);\n    IEOS_BIND_METHOD(stats_interface_copy_stat_by_name);\n    IEOS_BIND_METHOD(stats_interface_get_stats_count);\n    IEOS_BIND_METHOD(stats_interface_ingest_stat);\n    IEOS_BIND_METHOD(stats_interface_query_stats);\n    IEOS_BIND_METHOD(titlestorage_interface_copy_file_metadata_at_index);\n    IEOS_BIND_METHOD(titlestorage_interface_copy_file_metadata_by_filename);\n    IEOS_BIND_METHOD(titlestorage_interface_delete_cache);\n    IEOS_BIND_METHOD(titlestorage_interface_get_file_metadata_count);\n    IEOS_BIND_METHOD(titlestorage_interface_query_file);\n    IEOS_BIND_METHOD(titlestorage_interface_query_file_list);\n    IEOS_BIND_METHOD(titlestorage_interface_read_file);\n    IEOS_BIND_METHOD(ui_interface_acknowledge_event_id);\n    IEOS_BIND_METHOD(ui_interface_get_friends_exclusive_input);\n    IEOS_BIND_METHOD(ui_interface_get_friends_visible);\n    IEOS_BIND_METHOD(ui_interface_get_notification_location_preference);\n    IEOS_BIND_METHOD(ui_interface_get_toggle_friends_button);\n    IEOS_BIND_METHOD(ui_interface_get_toggle_friends_key);\n    IEOS_BIND_METHOD(ui_interface_hide_friends);\n    IEOS_BIND_METHOD(ui_interface_is_social_overlay_paused);\n    IEOS_BIND_METHOD(ui_interface_is_valid_button_combination);\n    IEOS_BIND_METHOD(ui_interface_is_valid_key_combination);\n    IEOS_BIND_METHOD(ui_interface_pause_social_overlay);\n    IEOS_BIND_METHOD(ui_interface_pre_present);\n    IEOS_BIND_METHOD(ui_interface_report_input_state);\n    IEOS_BIND_METHOD(ui_interface_set_display_preference);\n    IEOS_BIND_METHOD(ui_interface_set_toggle_friends_button);\n    IEOS_BIND_METHOD(ui_interface_set_toggle_friends_key);\n    IEOS_BIND_METHOD(ui_interface_show_block_player);\n    IEOS_BIND_METHOD(ui_interface_show_friends);\n    IEOS_BIND_METHOD(ui_interface_show_native_profile);\n    IEOS_BIND_METHOD(ui_interface_show_report_player);\n    IEOS_BIND_METHOD(user_info_interface_copy_best_display_name);\n    IEOS_BIND_METHOD(user_info_interface_copy_best_display_name_with_platform);\n    IEOS_BIND_METHOD(user_info_interface_copy_external_user_info_by_account_id);\n    IEOS_BIND_METHOD(user_info_interface_copy_external_user_info_by_account_type);\n    IEOS_BIND_METHOD(user_info_interface_copy_external_user_info_by_index);\n    IEOS_BIND_METHOD(user_info_interface_copy_user_info);\n    IEOS_BIND_METHOD(user_info_interface_get_external_user_info_count);\n    IEOS_BIND_METHOD(user_info_interface_get_local_platform_type);\n    IEOS_BIND_METHOD(user_info_interface_query_user_info);\n    IEOS_BIND_METHOD(user_info_interface_query_user_info_by_display_name);\n    IEOS_BIND_METHOD(user_info_interface_query_user_info_by_external_account);\n    IEOS_BIND_METHOD(version_interface_get_constants);\n    IEOS_BIND_METHOD(version_interface_get_version);\n    IEOS_BIND_METHOD(anticheat_server_interface_begin_session);\n    IEOS_BIND_METHOD(anticheat_server_interface_end_session);\n    IEOS_BIND_METHOD(anticheat_server_interface_register_client);\n    IEOS_BIND_METHOD(anticheat_server_interface_unregister_client);\n    IEOS_BIND_METHOD(anticheat_server_interface_receive_message_from_client);\n    IEOS_BIND_METHOD(anticheat_server_interface_set_client_details);\n    IEOS_BIND_METHOD(anticheat_server_interface_set_game_session_id);\n    IEOS_BIND_METHOD(anticheat_server_interface_set_client_network_state);\n    IEOS_BIND_METHOD(anticheat_server_interface_get_protect_message_output_length);\n    IEOS_BIND_METHOD(anticheat_server_interface_protect_message);\n    IEOS_BIND_METHOD(anticheat_server_interface_unprotect_message);\n    IEOS_BIND_METHOD(anticheat_server_interface_register_event);\n    IEOS_BIND_METHOD(anticheat_server_interface_log_event);\n    IEOS_BIND_METHOD(anticheat_server_interface_log_game_round_start);\n    IEOS_BIND_METHOD(anticheat_server_interface_log_game_round_end);\n    IEOS_BIND_METHOD(anticheat_server_interface_log_player_spawn);\n    IEOS_BIND_METHOD(anticheat_server_interface_log_player_despawn);\n    IEOS_BIND_METHOD(anticheat_server_interface_log_player_revive);\n    IEOS_BIND_METHOD(anticheat_server_interface_log_player_tick);\n    IEOS_BIND_METHOD(anticheat_server_interface_log_player_use_weapon);\n    IEOS_BIND_METHOD(anticheat_server_interface_log_player_use_ability);\n    IEOS_BIND_METHOD(anticheat_server_interface_log_player_take_damage);\n    IEOS_BIND_METHOD(anticheat_client_interface_begin_session);\n    IEOS_BIND_METHOD(anticheat_client_interface_end_session);\n    IEOS_BIND_METHOD(anticheat_client_interface_add_external_integrity_catalog);\n    IEOS_BIND_METHOD(anticheat_client_interface_receive_message_from_server);\n    IEOS_BIND_METHOD(anticheat_client_interface_get_protect_message_output_length);\n    IEOS_BIND_METHOD(anticheat_client_interface_protect_message);\n    IEOS_BIND_METHOD(anticheat_client_interface_unprotect_message);\n    IEOS_BIND_METHOD(anticheat_client_interface_register_peer);\n    IEOS_BIND_METHOD(anticheat_client_interface_unregister_peer);\n    IEOS_BIND_METHOD(anticheat_client_interface_receive_message_from_peer);\n\n    ADD_SIGNAL(MethodInfo(\"logging_interface_callback\", PropertyInfo(Variant::DICTIONARY, \"log_message\")));\n    IEOS_BIND_SIGNAL(achievements_interface_achievements_unlocked_v2_callback);\n    IEOS_BIND_SIGNAL(achievements_interface_query_definitions_callback);\n    IEOS_BIND_SIGNAL(achievements_interface_query_player_achievements_callback);\n    IEOS_BIND_SIGNAL(achievements_interface_unlock_achievements_callback);\n    IEOS_BIND_SIGNAL(auth_interface_delete_persistent_auth_callback);\n    IEOS_BIND_SIGNAL(auth_interface_link_account_callback);\n    IEOS_BIND_SIGNAL(auth_interface_login_callback);\n    IEOS_BIND_SIGNAL(auth_interface_login_status_changed);\n    IEOS_BIND_SIGNAL(auth_interface_logout_callback);\n    IEOS_BIND_SIGNAL(auth_interface_query_id_token_callback);\n    IEOS_BIND_SIGNAL(auth_interface_verify_id_token_callback);\n    IEOS_BIND_SIGNAL(auth_interface_verify_user_auth_callback);\n    IEOS_BIND_SIGNAL(connect_interface_auth_expiration);\n    IEOS_BIND_SIGNAL(connect_interface_create_device_id_callback);\n    IEOS_BIND_SIGNAL(connect_interface_create_user_callback);\n    IEOS_BIND_SIGNAL(connect_interface_delete_device_id_callback);\n    IEOS_BIND_SIGNAL(connect_interface_link_account_callback);\n    IEOS_BIND_SIGNAL(connect_interface_login_callback);\n    IEOS_BIND_SIGNAL(connect_interface_login_status_changed);\n    IEOS_BIND_SIGNAL(connect_interface_logout_callback);\n    IEOS_BIND_SIGNAL(connect_interface_query_external_account_mappings_callback);\n    IEOS_BIND_SIGNAL(connect_interface_query_product_user_id_mappings_callback);\n    IEOS_BIND_SIGNAL(connect_interface_transfer_device_id_account_callback);\n    IEOS_BIND_SIGNAL(connect_interface_unlink_account_callback);\n    IEOS_BIND_SIGNAL(connect_interface_verify_id_token_callback);\n    IEOS_BIND_SIGNAL(custom_invites_interface_accept_request_to_join_callback);\n    IEOS_BIND_SIGNAL(custom_invites_interface_custom_invite_accepted_callback);\n    IEOS_BIND_SIGNAL(custom_invites_interface_custom_invite_received_callback);\n    IEOS_BIND_SIGNAL(custom_invites_interface_custom_invite_rejected_callback);\n    IEOS_BIND_SIGNAL(custom_invites_interface_reject_request_to_join_callback);\n    IEOS_BIND_SIGNAL(custom_invites_interface_request_to_join_accepted_callback);\n    IEOS_BIND_SIGNAL(custom_invites_interface_request_to_join_received_callback);\n    IEOS_BIND_SIGNAL(custom_invites_interface_request_to_join_rejected_callback);\n    IEOS_BIND_SIGNAL(custom_invites_interface_request_to_join_response_received_callback);\n    IEOS_BIND_SIGNAL(custom_invites_interface_send_custom_invite_callback);\n    IEOS_BIND_SIGNAL(custom_invites_interface_send_request_to_join_callback);\n    IEOS_BIND_SIGNAL(ecom_interface_checkout_callback);\n    IEOS_BIND_SIGNAL(ecom_interface_query_entitlement_token_callback);\n    IEOS_BIND_SIGNAL(ecom_interface_query_entitlements_callback);\n    IEOS_BIND_SIGNAL(ecom_interface_query_offers_callback);\n    IEOS_BIND_SIGNAL(ecom_interface_query_ownership_by_sandbox_ids_callback);\n    IEOS_BIND_SIGNAL(ecom_interface_query_ownership_callback);\n    IEOS_BIND_SIGNAL(ecom_interface_query_ownership_token_callback);\n    IEOS_BIND_SIGNAL(ecom_interface_redeem_entitlements_callback);\n    IEOS_BIND_SIGNAL(friends_interface_accept_invite_callback);\n    IEOS_BIND_SIGNAL(friends_interface_blocked_users_update_callback);\n    IEOS_BIND_SIGNAL(friends_interface_friends_update_callback);\n    IEOS_BIND_SIGNAL(friends_interface_query_friends_callback);\n    IEOS_BIND_SIGNAL(friends_interface_reject_invite_callback);\n    IEOS_BIND_SIGNAL(friends_interface_send_invite_callback);\n    IEOS_BIND_SIGNAL(kws_interface_create_user_callback);\n    IEOS_BIND_SIGNAL(kws_interface_permissions_update_received_callback);\n    IEOS_BIND_SIGNAL(kws_interface_query_age_gate_callback);\n    IEOS_BIND_SIGNAL(kws_interface_query_permissions_callback);\n    IEOS_BIND_SIGNAL(kws_interface_request_permissions_callback);\n    IEOS_BIND_SIGNAL(kws_interface_update_parent_email_callback);\n    IEOS_BIND_SIGNAL(leaderboards_interface_query_leaderboard_definitions_callback);\n    IEOS_BIND_SIGNAL(leaderboards_interface_query_leaderboard_ranks_callback);\n    IEOS_BIND_SIGNAL(leaderboards_interface_query_leaderboard_user_scores_callback);\n    IEOS_BIND_SIGNAL(lobby_interface_create_lobby_callback);\n    IEOS_BIND_SIGNAL(lobby_interface_destroy_lobby_callback);\n    IEOS_BIND_SIGNAL(lobby_interface_join_rtc_room_callback);\n    IEOS_BIND_SIGNAL(lobby_interface_leave_rtc_room_callback);\n    IEOS_BIND_SIGNAL(lobby_interface_hard_mute_member_callback);\n    IEOS_BIND_SIGNAL(lobby_interface_join_lobby_accepted_callback);\n    IEOS_BIND_SIGNAL(lobby_interface_join_lobby_by_id_callback);\n    IEOS_BIND_SIGNAL(lobby_interface_join_lobby_callback);\n    IEOS_BIND_SIGNAL(lobby_interface_kick_member_callback);\n    IEOS_BIND_SIGNAL(lobby_interface_leave_lobby_callback);\n    IEOS_BIND_SIGNAL(lobby_interface_leave_lobby_requested_callback);\n    IEOS_BIND_SIGNAL(lobby_interface_lobby_invite_accepted_callback);\n    IEOS_BIND_SIGNAL(lobby_interface_lobby_invite_received_callback);\n    IEOS_BIND_SIGNAL(lobby_interface_lobby_invite_rejected_callback);\n    IEOS_BIND_SIGNAL(lobby_interface_lobby_member_status_received_callback);\n    IEOS_BIND_SIGNAL(lobby_interface_lobby_member_update_received_callback);\n    IEOS_BIND_SIGNAL(lobby_interface_lobby_update_received_callback);\n    IEOS_BIND_SIGNAL(lobby_interface_promote_member_callback);\n    IEOS_BIND_SIGNAL(lobby_interface_query_invites_callback);\n    IEOS_BIND_SIGNAL(lobby_interface_reject_invite_callback);\n    IEOS_BIND_SIGNAL(lobby_interface_rtc_room_connection_changed_callback);\n    IEOS_BIND_SIGNAL(lobby_interface_send_invite_callback);\n    IEOS_BIND_SIGNAL(lobby_interface_send_lobby_native_invite_requested_callback);\n    IEOS_BIND_SIGNAL(lobby_interface_update_lobby_callback);\n    IEOS_BIND_SIGNAL(lobby_search_find_callback);\n    IEOS_BIND_SIGNAL(mods_interface_enumerate_mods_callback);\n    IEOS_BIND_SIGNAL(mods_interface_install_mod_callback);\n    IEOS_BIND_SIGNAL(mods_interface_uninstall_mod_callback);\n    IEOS_BIND_SIGNAL(mods_interface_update_mod_callback);\n\tIEOS_BIND_SIGNAL(p2p_interface_query_nat_type_callback);\n    IEOS_BIND_SIGNAL(p2p_interface_incoming_packet_queue_full);\n    IEOS_BIND_SIGNAL(playerdatastorage_interface_delete_cache_callback);\n    IEOS_BIND_SIGNAL(playerdatastorage_interface_delete_file_callback);\n    IEOS_BIND_SIGNAL(playerdatastorage_interface_duplicate_file_callback);\n    IEOS_BIND_SIGNAL(playerdatastorage_interface_file_transfer_progress_callback);\n    IEOS_BIND_SIGNAL(playerdatastorage_interface_query_file_callback);\n    IEOS_BIND_SIGNAL(playerdatastorage_interface_query_file_list_callback);\n    IEOS_BIND_SIGNAL(playerdatastorage_interface_read_file_callback);\n    IEOS_BIND_SIGNAL(playerdatastorage_interface_read_file_data_callback);\n    IEOS_BIND_SIGNAL(playerdatastorage_interface_write_file_callback);\n    IEOS_BIND_SIGNAL(playerdatastorage_interface_write_file_data_callback);\n    IEOS_BIND_SIGNAL(presence_interface_join_game_accepted_callback);\n    IEOS_BIND_SIGNAL(presence_interface_presence_changed_callback);\n    IEOS_BIND_SIGNAL(presence_interface_query_presence_callback);\n    IEOS_BIND_SIGNAL(presence_interface_set_presence_callback);\n    IEOS_BIND_SIGNAL(progression_snapshot_interface_delete_snapshot_callback);\n    IEOS_BIND_SIGNAL(progression_snapshot_interface_submit_snapshot_callback);\n    IEOS_BIND_SIGNAL(reports_interface_send_player_behavior_report_callback);\n    IEOS_BIND_SIGNAL(rtc_audio_audio_before_render);\n    IEOS_BIND_SIGNAL(rtc_audio_audio_before_send);\n    IEOS_BIND_SIGNAL(rtc_audio_audio_devices_changed);\n    IEOS_BIND_SIGNAL(rtc_audio_audio_input_state);\n    IEOS_BIND_SIGNAL(rtc_audio_audio_output_state);\n    IEOS_BIND_SIGNAL(rtc_audio_interface_query_input_devices_information_callback);\n    IEOS_BIND_SIGNAL(rtc_audio_interface_query_output_devices_information_callback);\n    IEOS_BIND_SIGNAL(rtc_audio_interface_register_platform_user_callback);\n    IEOS_BIND_SIGNAL(rtc_audio_interface_set_input_device_settings_callback);\n    IEOS_BIND_SIGNAL(rtc_audio_interface_set_output_device_settings_callback);\n    IEOS_BIND_SIGNAL(rtc_audio_interface_unregister_platform_user_callback);\n    IEOS_BIND_SIGNAL(rtc_audio_interface_update_participant_volume_callback);\n    IEOS_BIND_SIGNAL(rtc_audio_interface_update_receiving_callback);\n    IEOS_BIND_SIGNAL(rtc_audio_interface_update_receiving_volume_callback);\n    IEOS_BIND_SIGNAL(rtc_audio_interface_update_sending_callback);\n    IEOS_BIND_SIGNAL(rtc_audio_interface_update_sending_volume_callback);\n    IEOS_BIND_SIGNAL(rtc_audio_participant_updated);\n    IEOS_BIND_SIGNAL(rtc_data_data_received);\n    IEOS_BIND_SIGNAL(rtc_data_participant_updated);\n    IEOS_BIND_SIGNAL(rtc_data_interface_update_receiving_callback);\n    IEOS_BIND_SIGNAL(rtc_data_interface_update_sending_callback);\n    IEOS_BIND_SIGNAL(rtc_interface_block_participant_callback);\n    IEOS_BIND_SIGNAL(rtc_interface_disconnected);\n    IEOS_BIND_SIGNAL(rtc_interface_join_room_callback);\n    IEOS_BIND_SIGNAL(rtc_interface_leave_room_callback);\n    IEOS_BIND_SIGNAL(rtc_interface_participant_status_changed);\n    IEOS_BIND_SIGNAL(rtc_interface_room_statistics_updated);\n    IEOS_BIND_SIGNAL(sanctions_interface_query_active_player_sanctions_callback);\n    IEOS_BIND_SIGNAL(sanctions_interface_create_player_sanction_appeal_callback);\n    IEOS_BIND_SIGNAL(session_search_find_callback);\n    IEOS_BIND_SIGNAL(sessions_interface_destroy_session_callback);\n    IEOS_BIND_SIGNAL(sessions_interface_end_session_callback);\n    IEOS_BIND_SIGNAL(sessions_interface_join_session_accepted_callback);\n    IEOS_BIND_SIGNAL(sessions_interface_join_session_callback);\n    IEOS_BIND_SIGNAL(sessions_interface_leave_session_requested_callback);\n    IEOS_BIND_SIGNAL(sessions_interface_query_invites_callback);\n    IEOS_BIND_SIGNAL(sessions_interface_register_players_callback);\n    IEOS_BIND_SIGNAL(sessions_interface_reject_invite_callback);\n    IEOS_BIND_SIGNAL(sessions_interface_send_invite_callback);\n    IEOS_BIND_SIGNAL(sessions_interface_send_session_native_invite_requested_callback);\n    IEOS_BIND_SIGNAL(sessions_interface_session_invite_accepted_callback);\n    IEOS_BIND_SIGNAL(sessions_interface_session_invite_received_callback);\n    IEOS_BIND_SIGNAL(sessions_interface_session_invite_rejected_callback);\n    IEOS_BIND_SIGNAL(sessions_interface_start_session_callback);\n    IEOS_BIND_SIGNAL(sessions_interface_unregister_players_callback);\n    IEOS_BIND_SIGNAL(sessions_interface_update_session_callback);\n    IEOS_BIND_SIGNAL(stats_interface_ingest_stat_callback);\n    IEOS_BIND_SIGNAL(stats_interface_query_stats_callback);\n    IEOS_BIND_SIGNAL(titlestorage_interface_delete_cache_callback);\n    IEOS_BIND_SIGNAL(titlestorage_interface_file_transfer_progress_callback);\n    IEOS_BIND_SIGNAL(titlestorage_interface_query_file_callback);\n    IEOS_BIND_SIGNAL(titlestorage_interface_query_file_list_callback);\n    IEOS_BIND_SIGNAL(titlestorage_interface_read_file_callback);\n    IEOS_BIND_SIGNAL(titlestorage_interface_read_file_data_callback);\n    IEOS_BIND_SIGNAL(ui_interface_display_settings_updated_callback);\n    IEOS_BIND_SIGNAL(ui_interface_hide_friends_callback);\n    IEOS_BIND_SIGNAL(ui_interface_memory_monitor_callback);\n    IEOS_BIND_SIGNAL(ui_interface_show_block_player_callback);\n    IEOS_BIND_SIGNAL(ui_interface_show_friends_callback);\n    IEOS_BIND_SIGNAL(ui_interface_show_native_profile_callback);\n    IEOS_BIND_SIGNAL(ui_interface_show_report_player_callback);\n    IEOS_BIND_SIGNAL(user_info_interface_query_user_info_by_display_name_callback);\n    IEOS_BIND_SIGNAL(user_info_interface_query_user_info_by_external_account_callback);\n    IEOS_BIND_SIGNAL(user_info_interface_query_user_info_callback);\n    IEOS_BIND_SIGNAL(anticheatserver_interface_message_to_client_callback);\n    IEOS_BIND_SIGNAL(anticheatserver_interface_client_action_required_callback);\n    IEOS_BIND_SIGNAL(anticheatserver_interface_client_auth_status_changed_callback);\n    IEOS_BIND_SIGNAL(anticheat_client_interface_message_to_server_callback);\n    IEOS_BIND_SIGNAL(anticheat_client_interface_message_to_peer_callback);\n    IEOS_BIND_SIGNAL(anticheat_client_interface_client_integrity_violated_callback);\n}\n\nbool IEOS::is_operation_complete(int p_result_code) {\n    return EOSG_GET_BOOL(EOS_EResult_IsOperationComplete(static_cast<EOS_EResult>(p_result_code)));\n}\n\nIEOS *IEOS::singleton = nullptr;\n\nIEOS *IEOS::get_singleton() { return singleton; }\n\nIEOS::IEOS() {\n    ERR_FAIL_COND(singleton != nullptr);\n    singleton = this;\n}\n\nIEOS::~IEOS() {\n    ERR_FAIL_COND(singleton != this);\n    if (s_platformInterface != nullptr) {\n        platform_interface_release();\n    }\n\n    for (auto const &[key, val] : anticheat_client_map) {\n        memfree(val);\n    }\n    anticheat_client_map.clear();\n\n    singleton = nullptr;\n}\n\nvoid IEOS::tick() {\n    if (singleton != nullptr && IEOS::get_singleton()->s_platformInterface != nullptr && IEOS::get_singleton()->isEOSValid) {\n        EOS_Platform_Tick(IEOS::get_singleton()->s_platformInterface);\n    }\n}"
  },
  {
    "path": "src/ieos.h",
    "content": "#pragma once\n#include \"eos_achievements.h\"\n#include \"eos_anticheatclient.h\"\n#include \"eos_anticheatserver.h\"\n#include \"eos_auth.h\"\n#include \"eos_custominvites.h\"\n#include \"eos_ecom.h\"\n#include \"eos_friends.h\"\n#include \"eos_kws.h\"\n#include \"eos_leaderboards.h\"\n#include \"eos_lobby.h\"\n#include \"eos_logging.h\"\n#include \"eos_metrics.h\"\n#include \"eos_mods.h\"\n#include \"eos_p2p.h\"\n#include \"eos_playerdatastorage.h\"\n#include \"eos_presence.h\"\n#include \"eos_progressionsnapshot.h\"\n#include \"eos_reports.h\"\n#include \"eos_rtc.h\"\n#include \"eos_rtc_audio.h\"\n#include \"eos_rtc_data.h\"\n#include \"eos_sanctions.h\"\n#include \"eos_sdk.h\"\n#include \"eos_sessions.h\"\n#include \"eos_stats.h\"\n#include \"eos_titlestorage.h\"\n#include \"eos_ui.h\"\n#include \"eos_userinfo.h\"\n#include \"eos_version.h\"\n#include \"eosg_file_transfer_request.h\"\n#include \"godot_cpp/classes/object.hpp\"\n#include \"godot_cpp/classes/os.hpp\"\n#include \"godot_cpp/classes/project_settings.hpp\"\n#include \"godot_cpp/classes/ref_counted.hpp\"\n#include \"godot_cpp/core/binder_common.hpp\"\n#include \"godot_cpp/core/class_db.hpp\"\n#include \"godot_cpp/variant/utility_functions.hpp\"\n#include \"unordered_map\"\n#include \"utils.h\"\n#ifdef _WIN32\n#include \"Windows/eos_Windows.h\"\n#endif\n\nnamespace godot {\n\nclass IEOS : public Object {\n    GDCLASS(IEOS, Object)\n\n    static IEOS *singleton;\n\nprotected:\n    static void _bind_methods();\n\n    EOS_HAchievements s_achievementsInterface = nullptr;\n    EOS_HAuth s_authInterface = nullptr;\n    EOS_HConnect s_connectInterface = nullptr;\n    EOS_HCustomInvites s_customInvitesInterface = nullptr;\n    EOS_HEcom s_ecomInterface = nullptr;\n    EOS_HFriends s_friendsInterface = nullptr;\n    EOS_HKWS s_kwsInterface = nullptr;\n    EOS_HLeaderboards s_leaderboardsInterface = nullptr;\n    EOS_HLobby s_lobbyInterface = nullptr;\n    EOS_HMetrics s_metricsInterface = nullptr;\n    EOS_HMods s_modsInterface = nullptr;\n    EOS_HP2P s_p2pInterface = nullptr;\n    EOS_HPlatform s_platformInterface = nullptr;\n    EOS_HPlayerDataStorage s_playerDataStorageInterface = nullptr;\n    EOS_HPresence s_presenceInterface = nullptr;\n    EOS_HProgressionSnapshot s_progressionSnapshotInterface = nullptr;\n    EOS_HReports s_reportsInterface = nullptr;\n    EOS_HRTC s_rtcInterface = nullptr;\n    EOS_HRTCAudio s_rtcAudioInterface = nullptr;\n    EOS_HRTCData s_rtcDataInterface = nullptr;\n    EOS_HSanctions s_sanctionsInterface = nullptr;\n    EOS_HSessions s_sessionsInterface = nullptr;\n    EOS_HStats s_statsInterface = nullptr;\n    EOS_HTitleStorage s_titleStorageInterface = nullptr;\n    EOS_HUI s_uiInterface = nullptr;\n    EOS_HUserInfo s_userInfoInterface = nullptr;\n    EOS_HAntiCheatServer s_antiCheatServerInterface = nullptr;\n    EOS_HAntiCheatClient s_antiCheatClientInterface = nullptr;\n\n    std::unordered_map<std::string, void *> anticheat_client_map; // {String: String} key: hash value: string\n\npublic:\n    bool isEOSValid = false; // is true if EOS Platform is initialized\n\n    static IEOS *get_singleton();\n\n    IEOS();\n    ~IEOS();\n\n    static void tick();\n    bool is_operation_complete(int result_code);\n\n    // -----\n    // Platform Interface\n    // -----\n    bool platform_interface_create(Ref<RefCounted> options);\n    Dictionary platform_interface_get_active_country_code(const String &local_user_id);\n    Dictionary platform_interface_get_active_locale_code(const String &local_user_id);\n    Dictionary platform_interface_get_desktop_crossplay_status_info();\n    Dictionary platform_interface_get_override_country_code();\n    Dictionary platform_interface_get_override_locale_code();\n    int platform_interface_check_for_launcher_and_restart();\n    int platform_interface_get_application_status();\n    int platform_interface_get_network_status();\n    int platform_interface_initialize(Ref<RefCounted> options);\n    int platform_interface_set_application_status(int status);\n    int platform_interface_set_network_status(int status);\n    int platform_interface_set_override_country_code(const String &country_code);\n    int platform_interface_set_override_locale_code(const String &locale_code);\n    int platform_interface_shutdown();\n    void platform_interface_release();\n\n    // -----\n    // Logging Interface\n    // -----\n    int logging_interface_set_log_level(int category, int level);\n\n    // -----\n    // Version Interface\n    // -----\n    Dictionary version_interface_get_constants();\n    String version_interface_get_version();\n\n    // -----\n    // Auth interface\n    // -----\n    Dictionary auth_interface_copy_id_token(Ref<RefCounted> options);\n    Dictionary auth_interface_copy_user_auth_token(Ref<RefCounted> options, const String &local_user_id);\n    Dictionary auth_interface_get_selected_account_id(const String &local_user_id);\n    int auth_interface_get_logged_in_accounts_count();\n    int auth_interface_get_login_status(const String &local_user_id);\n    int auth_interface_get_merged_accounts_count(const String &local_user_id);\n    String auth_interface_get_logged_in_account_by_index(int index);\n    String auth_interface_get_merged_account_by_index(const String &local_user_id, int index);\n    void auth_interface_delete_persistent_auth(Ref<RefCounted> options);\n    void auth_interface_link_account(Ref<RefCounted> options);\n    void auth_interface_login(Ref<RefCounted> options);\n    void auth_interface_logout(Ref<RefCounted> options);\n    void auth_interface_query_id_token(Ref<RefCounted> options);\n    void auth_interface_verify_id_token(Ref<RefCounted> options);\n    void auth_interface_verify_user_auth(Ref<RefCounted> _options);\n\n    // -----\n    // Connect Interface\n    // -----\n    Dictionary connect_interface_copy_id_token(Ref<RefCounted> options);\n    Dictionary connect_interface_copy_product_user_external_account_by_account_id(Ref<RefCounted> options);\n    Dictionary connect_interface_copy_product_user_external_account_by_account_type(Ref<RefCounted> options);\n    Dictionary connect_interface_copy_product_user_external_account_by_index(Ref<RefCounted> options);\n    Dictionary connect_interface_copy_product_user_info(Ref<RefCounted> options);\n    Dictionary connect_interface_get_product_user_id_mapping(Ref<RefCounted> options);\n    int connect_interface_get_logged_in_users_count();\n    int connect_interface_get_login_status(const String &local_user_id);\n    int connect_interface_get_product_user_external_account_count(Ref<RefCounted> options);\n    String connect_interface_get_external_account_mapping(Ref<RefCounted> options);\n    String connect_interface_get_logged_in_user_by_index(int index);\n    void connect_interface_create_device_id(Ref<RefCounted> options);\n    void connect_interface_create_user(Ref<RefCounted> options);\n    void connect_interface_delete_device_id(Ref<RefCounted> options);\n    void connect_interface_link_account(Ref<RefCounted> options);\n    void connect_interface_login(Ref<RefCounted> options);\n    void connect_interface_logout(Ref<RefCounted> options);\n    void connect_interface_query_product_user_id_mappings(Ref<RefCounted> options);\n    void connect_interface_query_external_account_mappings(Ref<RefCounted> options);\n    void connect_interface_transfer_device_id_account(Ref<RefCounted> options);\n    void connect_interface_unlink_account(Ref<RefCounted> options);\n    void connect_interface_verify_id_token(Ref<RefCounted> options);\n\n    // -----\n    // Achievements Interface\n    // -----\n    Dictionary achievements_interface_copy_achievement_definition_v2_by_achievement_id(Ref<RefCounted> options);\n    Dictionary achievements_interface_copy_achievement_definition_v2_by_index(Ref<RefCounted> options);\n    Dictionary achievements_interface_copy_player_achievement_by_achievement_id(Ref<RefCounted> options);\n    Dictionary achievements_interface_copy_player_achievement_by_index(Ref<RefCounted> options);\n    int achievements_interface_get_achievement_definition_count(Ref<RefCounted> options);\n    int achievements_interface_get_player_achievement_count(Ref<RefCounted> options);\n    void achievements_interface_query_definitions(Ref<RefCounted> options);\n    void achievements_interface_query_player_achievements(Ref<RefCounted> options);\n    void achievements_interface_unlock_achievements(Ref<RefCounted> options);\n\n    // -----\n    // Custom Invites Interface\n    // -----\n    int custom_invites_interface_finalize_invite(Ref<RefCounted> options);\n    int custom_invites_interface_set_custom_invite(Ref<RefCounted> options);\n    void custom_invites_interface_accept_request_to_join(Ref<RefCounted> options);\n    void custom_invites_interface_reject_request_to_join(Ref<RefCounted> options);\n    void custom_invites_interface_send_custom_invite(Ref<RefCounted> options);\n    void custom_invites_interface_send_request_to_join(Ref<RefCounted> options);\n\n    // -----\n    // Stats Interface\n    // -----\n    Dictionary stats_interface_copy_stat_by_index(Ref<RefCounted> options);\n    Dictionary stats_interface_copy_stat_by_name(Ref<RefCounted> options);\n    int stats_interface_get_stats_count(Ref<RefCounted> options);\n    void stats_interface_ingest_stat(Ref<RefCounted> options);\n    void stats_interface_query_stats(Ref<RefCounted> options);\n\n    // -----\n    // Leaderboards Interface\n    // -----\n    Dictionary leaderboards_interface_copy_leaderboard_definition_by_index(Ref<RefCounted> options);\n    Dictionary leaderboards_interface_copy_leaderboard_definition_by_leaderboard_id(Ref<RefCounted> options);\n    Dictionary leaderboards_interface_copy_leaderboard_record_by_index(Ref<RefCounted> options);\n    Dictionary leaderboards_interface_copy_leaderboard_record_by_user_id(Ref<RefCounted> options);\n    Dictionary leaderboards_interface_copy_leaderboard_user_score_by_index(Ref<RefCounted> options);\n    Dictionary leaderboards_interface_copy_leaderboard_user_score_by_user_id(Ref<RefCounted> options);\n    int leaderboards_interface_get_leaderboard_definition_count(Ref<RefCounted> options);\n    int leaderboards_interface_get_leaderboard_record_count(Ref<RefCounted> options);\n    int leaderboards_interface_get_leaderboard_user_score_count(Ref<RefCounted> options);\n    void leaderboards_interface_query_leaderboard_definitions(Ref<RefCounted> options);\n    void leaderboards_interface_query_leaderboard_ranks(Ref<RefCounted> options);\n    void leaderboards_interface_query_leaderboard_user_scores(Ref<RefCounted> options);\n\n    // -----\n    // Friends Interface\n    // -----\n    int friends_interface_get_blocked_users_count(Ref<RefCounted> options);\n    int friends_interface_get_friends_count(Ref<RefCounted> options);\n    int friends_interface_get_status(Ref<RefCounted> options);\n    String friends_interface_get_blocked_user_at_index(Ref<RefCounted> options);\n    String friends_interface_get_friend_at_index(Ref<RefCounted> options);\n    void friends_interface_accept_invite(Ref<RefCounted> options);\n    void friends_interface_query_friends(Ref<RefCounted> options);\n    void friends_interface_reject_invite(Ref<RefCounted> options);\n    void friends_interface_send_invite(Ref<RefCounted> options);\n\n    // -----\n    // Userinfo Interface\n    // -----\n    Dictionary user_info_interface_copy_best_display_name_with_platform(Ref<RefCounted> options);\n    Dictionary user_info_interface_copy_best_display_name(Ref<RefCounted> options);\n    Dictionary user_info_interface_copy_external_user_info_by_account_id(Ref<RefCounted> options);\n    Dictionary user_info_interface_copy_external_user_info_by_account_type(Ref<RefCounted> options);\n    Dictionary user_info_interface_copy_external_user_info_by_index(Ref<RefCounted> options);\n    Dictionary user_info_interface_copy_user_info(Ref<RefCounted> options);\n    int user_info_interface_get_external_user_info_count(Ref<RefCounted> options);\n    int user_info_interface_get_local_platform_type(Ref<RefCounted> options);\n    void user_info_interface_query_user_info_by_display_name(Ref<RefCounted> options);\n    void user_info_interface_query_user_info_by_external_account(Ref<RefCounted> options);\n    void user_info_interface_query_user_info(Ref<RefCounted> options);\n\n    // -----\n    // Ecom Interface\n    // -----\n    Dictionary ecom_interface_copy_entitlement_by_id(Ref<RefCounted> options);\n    Dictionary ecom_interface_copy_entitlement_by_index(Ref<RefCounted> options);\n    Dictionary ecom_interface_copy_entitlement_by_name_and_index(Ref<RefCounted> options);\n    Dictionary ecom_interface_copy_item_by_id(Ref<RefCounted> options);\n    Dictionary ecom_interface_copy_item_image_info_by_index(Ref<RefCounted> options);\n    Dictionary ecom_interface_copy_item_release_by_index(Ref<RefCounted> options);\n    Dictionary ecom_interface_copy_last_redeemed_entitlement_by_index(Ref<RefCounted> options);\n    Dictionary ecom_interface_copy_offer_by_id(Ref<RefCounted> options);\n    Dictionary ecom_interface_copy_offer_by_index(Ref<RefCounted> options);\n    Dictionary ecom_interface_copy_offer_image_info_by_index(Ref<RefCounted> options);\n    Dictionary ecom_interface_copy_offer_item_by_index(Ref<RefCounted> options);\n    Dictionary ecom_interface_copy_transaction_by_id(Ref<RefCounted> options);\n    Dictionary ecom_interface_copy_transaction_by_index(Ref<RefCounted> options);\n    int ecom_interface_get_entitlements_by_name_count(Ref<RefCounted> options);\n    int ecom_interface_get_entitlements_count(Ref<RefCounted> options);\n    int ecom_interface_get_item_image_info_count(Ref<RefCounted> options);\n    int ecom_interface_get_item_release_count(Ref<RefCounted> options);\n    int ecom_interface_get_last_redeemed_entitlements_count(Ref<RefCounted> options);\n    int ecom_interface_get_offer_count(Ref<RefCounted> options);\n    int ecom_interface_get_offer_image_info_count(Ref<RefCounted> options);\n    int ecom_interface_get_offer_item_count(Ref<RefCounted> options);\n    int ecom_interface_get_transaction_count(Ref<RefCounted> options);\n    void ecom_interface_checkout(Ref<RefCounted> options);\n    void ecom_interface_query_entitlements(Ref<RefCounted> options);\n    void ecom_interface_query_offers(Ref<RefCounted> options);\n    void ecom_interface_query_ownership_token(Ref<RefCounted> options);\n    void ecom_interface_query_ownership(Ref<RefCounted> options);\n    void ecom_interface_redeem_entitlements(Ref<RefCounted> options);\n    void ecom_interface_query_entitlement_token(Ref<RefCounted> options);\n    void ecom_interface_query_ownership_by_sandbox_ids(Ref<RefCounted> options);\n\n    // -----\n    // UI Interface\n    // -----\n    bool ui_interface_get_friends_exclusive_input(Ref<RefCounted> options);\n    bool ui_interface_get_friends_visible(Ref<RefCounted> options);\n    bool ui_interface_is_social_overlay_paused(Ref<RefCounted> options);\n    bool ui_interface_is_valid_button_combination(int button_combination);\n    bool ui_interface_is_valid_key_combination(int key_combination);\n    int ui_interface_acknowledge_event_id(Ref<RefCounted> options);\n    int ui_interface_get_notification_location_preference();\n    int ui_interface_get_toggle_friends_button(Ref<RefCounted> options);\n    int ui_interface_get_toggle_friends_key(Ref<RefCounted> options);\n    int ui_interface_pause_social_overlay(Ref<RefCounted> options);\n    int ui_interface_pre_present(Ref<RefCounted> options);\n    int ui_interface_report_input_state(Ref<RefCounted> options);\n    int ui_interface_set_display_preference(Ref<RefCounted> options);\n    int ui_interface_set_toggle_friends_button(Ref<RefCounted> options);\n    int ui_interface_set_toggle_friends_key(Ref<RefCounted> options);\n    void ui_interface_hide_friends(Ref<RefCounted> options);\n    void ui_interface_show_block_player(Ref<RefCounted> options);\n    void ui_interface_show_friends(Ref<RefCounted> options);\n    void ui_interface_show_native_profile(Ref<RefCounted> options);\n    void ui_interface_show_report_player(Ref<RefCounted> options);\n\n    // -----\n    // KWS Interface\n    // -----\n    Dictionary kws_interface_copy_permission_by_index(Ref<RefCounted> options);\n    Dictionary kws_interface_get_permission_by_key(Ref<RefCounted> options);\n    int kws_interface_get_permissions_count(Ref<RefCounted> options);\n    void kws_interface_create_user(Ref<RefCounted> options);\n    void kws_interface_query_age_gate(Ref<RefCounted> options);\n    void kws_interface_query_permissions(Ref<RefCounted> options);\n    void kws_interface_request_permissions(Ref<RefCounted> options);\n    void kws_interface_update_parent_email(Ref<RefCounted> options);\n\n    // -----\n    // Metrics Interface\n    // -----\n    int metrics_interface_begin_player_session(Ref<RefCounted> options);\n    int metrics_interface_end_player_session(Ref<RefCounted> options);\n\n    // -----\n    // Mods Interface\n    // -----\n    Dictionary mods_interface_copy_mod_info(Ref<RefCounted> options);\n    void mods_interface_enumerate_mods(Ref<RefCounted> options);\n    void mods_interface_install_mod(Ref<RefCounted> options);\n    void mods_interface_uninstall_mod(Ref<RefCounted> options);\n    void mods_interface_update_mod(Ref<RefCounted> options);\n\n    // -----\n    // Reports Interface\n    // -----\n    void reports_interface_send_player_behavior_report(Ref<RefCounted> options);\n\n    // -----\n    // Progression Snapshot Interface\n    // -----\n    Dictionary progression_snapshot_interface_begin_snapshot(Ref<RefCounted> options);\n    int progression_snapshot_interface_add_progression(Ref<RefCounted> options);\n    int progression_snapshot_interface_end_snapshot(Ref<RefCounted> options);\n    void progression_snapshot_interface_delete_snapshot(Ref<RefCounted> options);\n    void progression_snapshot_interface_submit_snapshot(Ref<RefCounted> options);\n\n    // -----\n    // Presence Interface\n    // -----\n    bool presence_interface_has_presence(Ref<RefCounted> options);\n    Dictionary presence_interface_copy_presence(Ref<RefCounted> options);\n    Dictionary presence_interface_create_presence_modification(Ref<RefCounted> options);\n    Dictionary presence_interface_get_join_info(Ref<RefCounted> options);\n    void presence_interface_query_presence(Ref<RefCounted> options);\n    void presence_interface_set_presence(Ref<RefCounted> options);\n\n    // -----\n    // Lobby Interface\n    // -----\n    Dictionary lobby_interface_copy_lobby_details_by_invite_id(Ref<RefCounted> options);\n    Dictionary lobby_interface_copy_lobby_details_by_ui_event_id(Ref<RefCounted> options);\n    Dictionary lobby_interface_copy_lobby_details(Ref<RefCounted> options);\n    Dictionary lobby_interface_create_lobby_search(Ref<RefCounted> options);\n    Dictionary lobby_interface_get_connect_string(Ref<RefCounted> options);\n    Dictionary lobby_interface_get_invite_id_by_index(Ref<RefCounted> options);\n    Dictionary lobby_interface_get_rtc_room_name(Ref<RefCounted> options);\n    Dictionary lobby_interface_is_rtc_room_connected(Ref<RefCounted> options);\n    Dictionary lobby_interface_parse_connect_string(Ref<RefCounted> options);\n    Dictionary lobby_interface_update_lobby_modification(Ref<RefCounted> options);\n    int lobby_interface_get_invite_count(Ref<RefCounted> options);\n    void lobby_interface_create_lobby(Ref<RefCounted> options);\n    void lobby_interface_destroy_lobby(Ref<RefCounted> options);\n    void lobby_interface_hard_mute_member(Ref<RefCounted> options);\n    void lobby_interface_join_lobby_by_id(Ref<RefCounted> options);\n    void lobby_interface_join_lobby(Ref<RefCounted> options);\n    void lobby_interface_join_rtc_room(Ref<RefCounted> options);\n    void lobby_interface_kick_member(Ref<RefCounted> options);\n    void lobby_interface_leave_lobby(Ref<RefCounted> options);\n    void lobby_interface_leave_rtc_room(Ref<RefCounted> options);\n    void lobby_interface_promote_member(Ref<RefCounted> options);\n    void lobby_interface_query_invites(Ref<RefCounted> options);\n    void lobby_interface_reject_invite(Ref<RefCounted> options);\n    void lobby_interface_send_invite(Ref<RefCounted> options);\n    void lobby_interface_update_lobby(Ref<RefCounted> options);\n\n    // -----\n    // P2P Interface\n    // -----\n\n    // Available in Godot functions\n    Dictionary p2p_interface_get_packet_queue_info();\n    Dictionary p2p_interface_get_port_range();\n    Dictionary p2p_interface_get_nat_type();\n    Dictionary p2p_interface_get_relay_control();\n    void p2p_interface_query_nat_type();\n    int p2p_interface_set_packet_queue_size(Ref<RefCounted> options);\n    int p2p_interface_set_port_range(Ref<RefCounted> options);\n    int p2p_interface_set_relay_control(int control);\n\n    // Not available in Godot. Called by EOSGMultiplayerPeer\n    EOS_EResult _p2p_accept_connection(const EOS_P2P_AcceptConnectionOptions *options);\n    EOS_EResult _p2p_clear_packet_queue(const EOS_P2P_ClearPacketQueueOptions *options);\n    EOS_EResult _p2p_close_all_connections(const EOS_P2P_CloseConnectionsOptions *options);\n    EOS_EResult _p2p_close_connection(const EOS_P2P_CloseConnectionOptions *options);\n    EOS_EResult _p2p_get_next_packet_size(const EOS_P2P_GetNextReceivedPacketSizeOptions *options, uint32_t *out_size);\n    EOS_EResult _p2p_receive_packet(const EOS_P2P_ReceivePacketOptions *options, void *out_packet_data, uint32_t *out_packet_size, uint8_t *out_channel, EOS_ProductUserId *remote_user, EOS_P2P_SocketId *out_socket);\n    EOS_EResult _p2p_send_packet(const EOS_P2P_SendPacketOptions *options);\n    EOS_NotificationId _p2p_add_notify_peer_connection_closed(const EOS_P2P_AddNotifyPeerConnectionClosedOptions *options, EOS_P2P_OnRemoteConnectionClosedCallback callback);\n    EOS_NotificationId _p2p_add_notify_peer_connection_established(const EOS_P2P_AddNotifyPeerConnectionEstablishedOptions *options, EOS_P2P_OnPeerConnectionEstablishedCallback callback);\n    EOS_NotificationId _p2p_add_notify_peer_connection_interrupted(const EOS_P2P_AddNotifyPeerConnectionInterruptedOptions *options, EOS_P2P_OnPeerConnectionInterruptedCallback callback);\n    EOS_NotificationId _p2p_add_notify_peer_connection_request(const EOS_P2P_AddNotifyPeerConnectionRequestOptions *options, EOS_P2P_OnIncomingConnectionRequestCallback callback);\n    void _p2p_remove_notify_peer_connection_closed(EOS_NotificationId callback_id);\n    void _p2p_remove_notify_peer_connection_established(EOS_NotificationId callback_id);\n    void _p2p_remove_notify_peer_connection_interrupted(EOS_NotificationId callback_id);\n    void _p2p_remove_notify_peer_connection_request(EOS_NotificationId callback_id);\n\n    // -----\n    // PlayerDataStorage Interface\n    // -----\n    Dictionary playerdatastorage_interface_copy_file_metadata_at_index(Ref<RefCounted> options);\n    Dictionary playerdatastorage_interface_copy_file_metadata_by_filename(Ref<RefCounted> options);\n    Dictionary playerdatastorage_interface_get_file_metadata_count(Ref<RefCounted> options);\n    int playerdatastorage_interface_delete_cache(Ref<RefCounted> options);\n    Variant playerdatastorage_interface_read_file(Ref<RefCounted> options);\n    Variant playerdatastorage_interface_write_file(Ref<RefCounted> options);\n    void playerdatastorage_interface_delete_file(Ref<RefCounted> options);\n    void playerdatastorage_interface_duplicate_file(Ref<RefCounted> options);\n    void playerdatastorage_interface_query_file_list(Ref<RefCounted> options);\n    void playerdatastorage_interface_query_file(Ref<RefCounted> options);\n\n    // -----\n    // TitleStorage Interface\n    // -----\n    Dictionary titlestorage_interface_copy_file_metadata_at_index(Ref<RefCounted> options);\n    Dictionary titlestorage_interface_copy_file_metadata_by_filename(Ref<RefCounted> options);\n    int titlestorage_interface_delete_cache(Ref<RefCounted> options);\n    int titlestorage_interface_get_file_metadata_count(Ref<RefCounted> options);\n    Variant titlestorage_interface_read_file(Ref<RefCounted> options);\n    void titlestorage_interface_query_file_list(Ref<RefCounted> options);\n    void titlestorage_interface_query_file(Ref<RefCounted> options);\n\n    // -----\n    // Sanctions Interface\n    // -----\n    Dictionary sanctions_interface_copy_player_sanction_by_index(Ref<RefCounted> options);\n    int sanctions_interface_get_player_sanction_count(Ref<RefCounted> options);\n    void sanctions_interface_query_active_player_sanctions(Ref<RefCounted> options);\n    void sanctions_interface_create_player_sanction_appeal(Ref<RefCounted> options);\n\n    // -----\n    // Sessions Interface\n    // -----\n    Dictionary sessions_interface_copy_active_session_details(Ref<RefCounted> options);\n    Dictionary sessions_interface_copy_session_details_by_invite_id(Ref<RefCounted> options);\n    Dictionary sessions_interface_copy_session_details_by_ui_event_id(Ref<RefCounted> options);\n    Dictionary sessions_interface_copy_session_details_for_presence(Ref<RefCounted> options);\n    Dictionary sessions_interface_create_session_modification(Ref<RefCounted> options);\n    Dictionary sessions_interface_create_session_search(Ref<RefCounted> options);\n    Dictionary sessions_interface_get_invite_id_by_index(Ref<RefCounted> options);\n    Dictionary sessions_interface_update_session_modification(Ref<RefCounted> options);\n    int sessions_interface_dump_session_state(Ref<RefCounted> options);\n    int sessions_interface_get_invite_count(Ref<RefCounted> options);\n    int sessions_interface_is_user_in_session(Ref<RefCounted> options);\n    void sessions_interface_destroy_session(Ref<RefCounted> options);\n    void sessions_interface_end_session(Ref<RefCounted> options);\n    void sessions_interface_join_session(Ref<RefCounted> options);\n    void sessions_interface_query_invites(Ref<RefCounted> options);\n    void sessions_interface_register_players(Ref<RefCounted> options);\n    void sessions_interface_reject_invite(Ref<RefCounted> options);\n    void sessions_interface_send_invite(Ref<RefCounted> options);\n    void sessions_interface_start_session(Ref<RefCounted> options);\n    void sessions_interface_unregister_players(Ref<RefCounted> options);\n    void sessions_interface_update_session(Ref<RefCounted> options);\n\n    // -----\n    // RTCAudio Interface\n    // -----\n    Dictionary rtc_audio_interface_copy_input_device_information_by_index(Ref<RefCounted> options);\n    Dictionary rtc_audio_interface_copy_output_device_information_by_index(Ref<RefCounted> options);\n    int rtc_audio_interface_add_notify_audio_before_render(Ref<RefCounted> options);\n    int rtc_audio_interface_add_notify_audio_before_send(Ref<RefCounted> options);\n    int rtc_audio_interface_add_notify_audio_input_state(Ref<RefCounted> options);\n    int rtc_audio_interface_add_notify_audio_output_state(Ref<RefCounted> options);\n    int rtc_audio_interface_add_notify_participant_updated(Ref<RefCounted> options);\n    int rtc_audio_interface_get_input_devices_count(Ref<RefCounted> options);\n    int rtc_audio_interface_get_output_devices_count(Ref<RefCounted> options);\n    int rtc_audio_interface_send_audio(const Ref<RefCounted> &options);\n    void rtc_audio_interface_query_input_devices_information(Ref<RefCounted> options);\n    void rtc_audio_interface_query_output_devices_information(Ref<RefCounted> options);\n    void rtc_audio_interface_register_platform_user(Ref<RefCounted> options);\n    void rtc_audio_interface_remove_notify_audio_before_render(int notification_id);\n    void rtc_audio_interface_remove_notify_audio_before_send(int notification_id);\n    void rtc_audio_interface_remove_notify_audio_input_state(int notification_id);\n    void rtc_audio_interface_remove_notify_audio_output_state(int notification_id);\n    void rtc_audio_interface_remove_notify_participant_updated(int notification_id);\n    void rtc_audio_interface_set_input_device_settings(Ref<RefCounted> options);\n    void rtc_audio_interface_set_output_device_settings(Ref<RefCounted> options);\n    void rtc_audio_interface_unregister_platform_user(Ref<RefCounted> options);\n    void rtc_audio_interface_update_participant_volume(Ref<RefCounted> options);\n    void rtc_audio_interface_update_receiving(Ref<RefCounted> options);\n    void rtc_audio_interface_update_receiving_volume(Ref<RefCounted> options);\n    void rtc_audio_interface_update_sending(Ref<RefCounted> options);\n    void rtc_audio_interface_update_sending_volume(Ref<RefCounted> options);\n\n    // -----\n    // RTCData Interface\n    // -----\n    int rtc_data_interface_add_notify_data_received(Ref<RefCounted> options);\n    int rtc_data_interface_add_notify_participant_updated(Ref<RefCounted> options);\n    int rtc_data_interface_send_data(Ref<RefCounted> options);\n    void rtc_data_interface_remove_notify_data_received(int notification_id);\n    void rtc_data_interface_remove_notify_participant_updated(int notification_id);\n    void rtc_data_interface_update_receiving(Ref<RefCounted> options);\n    void rtc_data_interface_update_sending(Ref<RefCounted> options);\n\n    // -----\n    // RTC Interface\n    // -----\n    // TODO: impl rtc_interface_get_data_interface\n    int rtc_interface_add_notify_disconnected(Ref<RefCounted> options);\n    int rtc_interface_add_notify_participant_status_changed(Ref<RefCounted> options);\n    int rtc_interface_add_notify_room_statistics_updated(Ref<RefCounted> options);\n    int rtc_interface_set_room_setting(Ref<RefCounted> options);\n    int rtc_interface_set_setting(Ref<RefCounted> options);\n    void rtc_interface_block_participant(Ref<RefCounted> options);\n    void rtc_interface_join_room(Ref<RefCounted> options);\n    void rtc_interface_leave_room(Ref<RefCounted> options);\n    void rtc_interface_remove_notify_disconnected(int notification_id);\n    void rtc_interface_remove_notify_participant_status_changed(int notification_id);\n    void rtc_interface_remove_notify_room_statistics_updated(int notification_id);\n\n    // -----\n    // AntiCheatServer Interface\n    // -----\n    int anticheat_server_interface_begin_session(Ref<RefCounted> options);\n    int anticheat_server_interface_end_session(Ref<RefCounted> options);\n    int anticheat_server_interface_register_client(Ref<RefCounted> options);\n    int anticheat_server_interface_unregister_client(Ref<RefCounted> options);\n    int anticheat_server_interface_receive_message_from_client(Ref<RefCounted> options);\n    int anticheat_server_interface_set_client_details(Ref<RefCounted> options);\n    int anticheat_server_interface_set_game_session_id(Ref<RefCounted> options);\n    int anticheat_server_interface_set_client_network_state(Ref<RefCounted> options);\n    Dictionary anticheat_server_interface_get_protect_message_output_length(Ref<RefCounted> options);\n    Dictionary anticheat_server_interface_protect_message(Ref<RefCounted> options);\n    Dictionary anticheat_server_interface_unprotect_message(Ref<RefCounted> options);\n    int anticheat_server_interface_register_event(Ref<RefCounted> options);\n    int anticheat_server_interface_log_event(Ref<RefCounted> options);\n    int anticheat_server_interface_log_game_round_start(Ref<RefCounted> options);\n    int anticheat_server_interface_log_game_round_end(Ref<RefCounted> options);\n    int anticheat_server_interface_log_player_spawn(Ref<RefCounted> options);\n    int anticheat_server_interface_log_player_despawn(Ref<RefCounted> options);\n    int anticheat_server_interface_log_player_revive(Ref<RefCounted> options);\n    int anticheat_server_interface_log_player_tick(Ref<RefCounted> options);\n    int anticheat_server_interface_log_player_use_weapon(Ref<RefCounted> options);\n    int anticheat_server_interface_log_player_use_ability(Ref<RefCounted> options);\n    int anticheat_server_interface_log_player_take_damage(Ref<RefCounted> options);\n\n    // -----\n    // AntiCheatClient Interface\n    // -----\n    int anticheat_client_interface_begin_session(Ref<RefCounted> options);\n    int anticheat_client_interface_end_session(Ref<RefCounted> options);\n    int anticheat_client_interface_add_external_integrity_catalog(Ref<RefCounted> options);\n    int anticheat_client_interface_receive_message_from_server(Ref<RefCounted> options);\n    Dictionary anticheat_client_interface_get_protect_message_output_length(Ref<RefCounted> options);\n    Dictionary anticheat_client_interface_protect_message(Ref<RefCounted> options);\n    Dictionary anticheat_client_interface_unprotect_message(Ref<RefCounted> options);\n    int anticheat_client_interface_register_peer(Ref<RefCounted> options);\n    int anticheat_client_interface_unregister_peer(Ref<RefCounted> options);\n    int anticheat_client_interface_receive_message_from_peer(Ref<RefCounted> options);\n\n    void *_anticheat_player_id_to_handle(CharString p_player_id) {\n        std::string player_id = p_player_id.get_data();\n\n        if (anticheat_client_map.count(player_id) == 0) {\n            anticheat_client_map[player_id] = memalloc(1);\n        }\n        return anticheat_client_map[player_id];\n    }\n\n    String _anticheat_player_handle_to_id(void *p_player_handle) {\n        for (auto const &[key, val] : anticheat_client_map) {\n            if (val == p_player_handle) {\n                return String(key.c_str());\n            }\n        }\n        return String(\"\");\n    }\n};\n\n} // namespace godot\n"
  },
  {
    "path": "src/kws_interface.cpp",
    "content": "#include \"ieos.h\"\nusing namespace godot;\n\nDictionary IEOS::kws_interface_copy_permission_by_index(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_kwsInterface, {});\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n\n    EOS_KWS_CopyPermissionByIndexOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_KWS_COPYPERMISSIONBYINDEX_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.Index = static_cast<uint32_t>(static_cast<int>(p_options->get(\"index\")));\n\n    EOS_KWS_PermissionStatus *outPermission = nullptr;\n    EOS_EResult res = EOS_KWS_CopyPermissionByIndex(s_kwsInterface, &options, &outPermission);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"permission\"] = eosg_kws_permission_status_to_dict_and_release(outPermission);\n    return ret;\n}\n\nvoid IEOS::kws_interface_create_user(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_kwsInterface);\n\tCharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString parent_email = VARIANT_TO_CHARSTRING(p_options->get(\"parent_email\"));\n    CharString date_of_birth = VARIANT_TO_CHARSTRING(p_options->get(\"date_of_birth\"));\n\n    EOS_KWS_CreateUserOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_KWS_CREATEUSER_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.ParentEmail = parent_email.get_data();\n    options.DateOfBirth = date_of_birth.get_data();\n    p_options->reference();\n\n    EOS_KWS_CreateUser(s_kwsInterface, &options, (void *)*p_options, [](const EOS_KWS_CreateUserCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n        ret[\"kws_user_id\"] = EOSG_GET_STRING(data->KWSUserId);\n        ret[\"is_minor\"] = EOSG_GET_BOOL(data->bIsMinor);\n        IEOS::get_singleton()->emit_signal(\"kws_interface_create_user_callback\", ret);\n    });\n}\n\nDictionary IEOS::kws_interface_get_permission_by_key(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_kwsInterface, {});\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString key = VARIANT_TO_CHARSTRING(p_options->get(\"key\"));\n\n    EOS_KWS_GetPermissionByKeyOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_KWS_GETPERMISSIONBYKEY_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.Key = key.get_data();\n\n    EOS_EKWSPermissionStatus *outPermission;\n    EOS_EResult res = EOS_KWS_GetPermissionByKey(s_kwsInterface, &options, outPermission);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"permission\"] = static_cast<int>(*outPermission);\n    return ret;\n}\n\nint IEOS::kws_interface_get_permissions_count(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_kwsInterface, 0);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n\n    EOS_KWS_GetPermissionsCountOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_KWS_GETPERMISSIONSCOUNT_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n\n    return static_cast<int>(EOS_KWS_GetPermissionsCount(s_kwsInterface, &options));\n}\n\nvoid IEOS::kws_interface_query_age_gate(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_kwsInterface);\n    EOS_KWS_QueryAgeGateOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_KWS_QUERYAGEGATE_API_LATEST;\n    p_options->reference();\n\n    EOS_KWS_QueryAgeGate(s_kwsInterface, &options, (void *)*p_options, [](const EOS_KWS_QueryAgeGateCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"country_code\"] = EOSG_GET_STRING(data->CountryCode);\n        ret[\"age_of_consent\"] = data->AgeOfConsent;\n        IEOS::get_singleton()->emit_signal(\"kws_interface_query_age_gate_callback\", ret);\n    });\n}\n\nvoid IEOS::kws_interface_query_permissions(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_kwsInterface);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n\n    EOS_KWS_QueryPermissionsOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_KWS_QUERYPERMISSIONS_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    p_options->reference();\n\n    EOS_KWS_QueryPermissions(s_kwsInterface, &options, (void *)*p_options, [](const EOS_KWS_QueryPermissionsCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n        ret[\"kws_user_id\"] = EOSG_GET_STRING(data->KWSUserId);\n        ret[\"is_minor\"] = EOSG_GET_BOOL(data->bIsMinor);\n        ret[\"parent_email\"] = EOSG_GET_STRING(data->ParentEmail);\n        IEOS::get_singleton()->emit_signal(\"kws_interface_query_permissions_callback\", ret);\n    });\n}\n\nvoid IEOS::kws_interface_request_permissions(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_kwsInterface);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    Array p_permission_keys = p_options->get(\"permission_keys\");\n    int p_permission_keys_size = p_permission_keys.size();\n\n    const char **permissionsKeys = (const char **)memalloc(sizeof(char *) * p_permission_keys_size);\n\tPERSISTENT_CHAR_ARRAY_CREATE(permissions_keys, permissions_keys_charstrings, p_permission_keys_size)\n    for (int i = 0; i < p_permission_keys_size; i++) {\n\t\tPERSISTENT_CHAR_ARRAY_SET(permissions_keys, permissions_keys_charstrings, i, p_permission_keys[i]);\n        permissionsKeys[i] = permissions_keys[i];\n    }\n\n    EOS_KWS_RequestPermissionsOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_KWS_REQUESTPERMISSIONS_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.PermissionKeys = permissionsKeys;\n    options.PermissionKeyCount = p_permission_keys_size;\n    p_options->reference();\n\n    EOS_KWS_RequestPermissions(s_kwsInterface, &options, (void *)*p_options, [](const EOS_KWS_RequestPermissionsCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n        IEOS::get_singleton()->emit_signal(\"kws_interface_request_permissions_callback\", ret);\n    });\n}\n\nvoid IEOS::kws_interface_update_parent_email(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_kwsInterface);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString parent_email = VARIANT_TO_CHARSTRING(p_options->get(\"parent_email\"));\n\n    EOS_KWS_UpdateParentEmailOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_KWS_UPDATEPARENTEMAIL_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.ParentEmail = parent_email.get_data();\n    p_options->reference();\n\n    EOS_KWS_UpdateParentEmail(s_kwsInterface, &options, (void *)*p_options, [](const EOS_KWS_UpdateParentEmailCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n        IEOS::get_singleton()->emit_signal(\"kws_interface_update_parent_email_callback\", ret);\n    });\n}\n"
  },
  {
    "path": "src/leaderboards_interface.cpp",
    "content": "#include \"ieos.h\"\nusing namespace std;\n\nDictionary IEOS::leaderboards_interface_copy_leaderboard_definition_by_index(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_leaderboardsInterface, {});\n    EOS_Leaderboards_CopyLeaderboardDefinitionByIndexOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_LEADERBOARDS_COPYLEADERBOARDDEFINITIONBYINDEX_API_LATEST;\n    options.LeaderboardIndex = static_cast<uint32_t>(static_cast<int>(p_options->get(\"leaderboard_index\")));\n\n    EOS_Leaderboards_Definition *outLeaderboardDefinition = nullptr;\n    EOS_EResult res = EOS_Leaderboards_CopyLeaderboardDefinitionByIndex(s_leaderboardsInterface, &options, &outLeaderboardDefinition);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"definition\"] = eosg_leaderboards_definition_to_dict_and_release(outLeaderboardDefinition);\n    return ret;\n}\n\nDictionary IEOS::leaderboards_interface_copy_leaderboard_definition_by_leaderboard_id(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_leaderboardsInterface, {});\n    CharString leaderboard_id = VARIANT_TO_CHARSTRING(p_options->get(\"leaderboard_id\"));\n    EOS_Leaderboards_CopyLeaderboardDefinitionByLeaderboardIdOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_LEADERBOARDS_COPYLEADERBOARDDEFINITIONBYLEADERBOARDID_API_LATEST;\n    options.LeaderboardId = leaderboard_id.get_data();\n\n    EOS_Leaderboards_Definition *outLeaderboardDefinition = nullptr;\n    EOS_EResult res = EOS_Leaderboards_CopyLeaderboardDefinitionByLeaderboardId(s_leaderboardsInterface, &options, &outLeaderboardDefinition);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"definition\"] = eosg_leaderboards_definition_to_dict_and_release(outLeaderboardDefinition);\n    return ret;\n}\n\nDictionary IEOS::leaderboards_interface_copy_leaderboard_record_by_index(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_leaderboardsInterface, {});\n    EOS_Leaderboards_CopyLeaderboardRecordByIndexOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_LEADERBOARDS_COPYLEADERBOARDRECORDBYINDEX_API_LATEST;\n    options.LeaderboardRecordIndex = static_cast<uint32_t>(static_cast<int>(p_options->get(\"leaderboard_record_index\")));\n\n    EOS_Leaderboards_LeaderboardRecord *outLeaderboardRecord = nullptr;\n    EOS_EResult res = EOS_Leaderboards_CopyLeaderboardRecordByIndex(s_leaderboardsInterface, &options, &outLeaderboardRecord);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"record\"] = eosg_leaderboards_leaderboard_record_to_dict_and_release(outLeaderboardRecord);\n    return ret;\n}\n\nDictionary IEOS::leaderboards_interface_copy_leaderboard_record_by_user_id(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_leaderboardsInterface, {});\n    CharString user_id = VARIANT_TO_CHARSTRING(p_options->get(\"user_id\"));\n\n    EOS_Leaderboards_CopyLeaderboardRecordByUserIdOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_LEADERBOARDS_COPYLEADERBOARDRECORDBYUSERID_API_LATEST;\n    options.UserId = eosg_string_to_product_user_id(user_id.get_data());\n\n    EOS_Leaderboards_LeaderboardRecord *outLeaderboardRecord = nullptr;\n    EOS_EResult res = EOS_Leaderboards_CopyLeaderboardRecordByUserId(s_leaderboardsInterface, &options, &outLeaderboardRecord);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"record\"] = eosg_leaderboards_leaderboard_record_to_dict_and_release(outLeaderboardRecord);\n    return ret;\n}\n\nDictionary IEOS::leaderboards_interface_copy_leaderboard_user_score_by_index(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_leaderboardsInterface, {});\n    CharString stat_name = VARIANT_TO_CHARSTRING(p_options->get(\"stat_name\"));\n\n    EOS_Leaderboards_CopyLeaderboardUserScoreByIndexOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_LEADERBOARDS_COPYLEADERBOARDUSERSCOREBYINDEX_API_LATEST;\n    options.LeaderboardUserScoreIndex = static_cast<uint32_t>(static_cast<int>(p_options->get(\"leaderboard_user_score_index\")));\n    options.StatName = stat_name.get_data();\n\n    EOS_Leaderboards_LeaderboardUserScore *outLeaderboardUserScore = nullptr;\n    EOS_EResult res = EOS_Leaderboards_CopyLeaderboardUserScoreByIndex(s_leaderboardsInterface, &options, &outLeaderboardUserScore);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"user_score\"] = eosg_leaderboards_leaderboard_user_score_to_dict_and_release(outLeaderboardUserScore);\n    return ret;\n}\n\nDictionary IEOS::leaderboards_interface_copy_leaderboard_user_score_by_user_id(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_leaderboardsInterface, {});\n    CharString user_id = VARIANT_TO_CHARSTRING(p_options->get(\"user_id\"));\n    CharString stat_name = VARIANT_TO_CHARSTRING(p_options->get(\"stat_name\"));\n\n    EOS_Leaderboards_CopyLeaderboardUserScoreByUserIdOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_LEADERBOARDS_COPYLEADERBOARDUSERSCOREBYUSERID_API_LATEST;\n    options.UserId = eosg_string_to_product_user_id(user_id.get_data());\n    options.StatName = stat_name.get_data();\n\n    EOS_Leaderboards_LeaderboardUserScore *outLeaderboardUserScore = nullptr;\n    EOS_EResult res = EOS_Leaderboards_CopyLeaderboardUserScoreByUserId(s_leaderboardsInterface, &options, &outLeaderboardUserScore);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"user_score\"] = eosg_leaderboards_leaderboard_user_score_to_dict_and_release(outLeaderboardUserScore);\n    return ret;\n}\n\nint IEOS::leaderboards_interface_get_leaderboard_definition_count(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_leaderboardsInterface, 0);\n    EOS_Leaderboards_GetLeaderboardDefinitionCountOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_LEADERBOARDS_GETLEADERBOARDDEFINITIONCOUNT_API_LATEST;\n\n    return static_cast<int>(EOS_Leaderboards_GetLeaderboardDefinitionCount(s_leaderboardsInterface, &options));\n}\n\nint IEOS::leaderboards_interface_get_leaderboard_record_count(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_leaderboardsInterface, 0);\n    EOS_Leaderboards_GetLeaderboardRecordCountOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_LEADERBOARDS_GETLEADERBOARDRECORDCOUNT_API_LATEST;\n\n    return static_cast<int>(EOS_Leaderboards_GetLeaderboardRecordCount(s_leaderboardsInterface, &options));\n}\n\nint IEOS::leaderboards_interface_get_leaderboard_user_score_count(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_leaderboardsInterface, 0);\n    CharString stat_name = VARIANT_TO_CHARSTRING(p_options->get(\"stat_name\"));\n\n    EOS_Leaderboards_GetLeaderboardUserScoreCountOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_LEADERBOARDS_GETLEADERBOARDUSERSCORECOUNT_API_LATEST;\n    options.StatName = stat_name.get_data();\n\n    return static_cast<int>(EOS_Leaderboards_GetLeaderboardUserScoreCount(s_leaderboardsInterface, &options));\n}\n\nvoid IEOS::leaderboards_interface_query_leaderboard_definitions(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_leaderboardsInterface);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n\n    EOS_Leaderboards_QueryLeaderboardDefinitionsOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_LEADERBOARDS_QUERYLEADERBOARDDEFINITIONS_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.StartTime = static_cast<int64_t>(p_options->get(\"start_time\"));\n    options.EndTime = static_cast<int64_t>(p_options->get(\"end_time\"));\n    p_options->reference();\n\n    EOS_Leaderboards_QueryLeaderboardDefinitions(s_leaderboardsInterface, &options, (void *)*p_options, [](const EOS_Leaderboards_OnQueryLeaderboardDefinitionsCompleteCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        IEOS::get_singleton()->emit_signal(\"leaderboards_interface_query_leaderboard_definitions_callback\", ret);\n    });\n}\n\nvoid IEOS::leaderboards_interface_query_leaderboard_ranks(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_leaderboardsInterface);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString leaderboard_id = VARIANT_TO_CHARSTRING(p_options->get(\"leaderboard_id\"));\n\n    EOS_Leaderboards_QueryLeaderboardRanksOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_LEADERBOARDS_QUERYLEADERBOARDRANKS_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.LeaderboardId = leaderboard_id.get_data();\n    p_options->reference();\n\n    EOS_Leaderboards_QueryLeaderboardRanks(s_leaderboardsInterface, &options, (void *)*p_options, [](const EOS_Leaderboards_OnQueryLeaderboardRanksCompleteCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"leaderboard_id\"] = EOSG_GET_STRING(data->LeaderboardId);\n        IEOS::get_singleton()->emit_signal(\"leaderboards_interface_query_leaderboard_ranks_callback\", ret);\n    });\n}\n\nvoid IEOS::leaderboards_interface_query_leaderboard_user_scores(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_leaderboardsInterface);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n\n    Array p_user_ids = p_options->get(\"user_ids\");\n    int p_user_ids_size = p_user_ids.size();\n\n    EOS_ProductUserId *user_ids = (EOS_ProductUserId *)memalloc(sizeof(EOS_ProductUserId) * p_user_ids_size);\n\tPERSISTENT_CHAR_ARRAY_CREATE(user_ids_cstr, user_ids_cstr_charstrings, p_user_ids_size)\n    for (int i = 0; i < p_user_ids_size; i++) {\n\t\tPERSISTENT_CHAR_ARRAY_SET(user_ids_cstr, user_ids_cstr_charstrings, i, p_user_ids[i]);\n        user_ids[i] = eosg_string_to_product_user_id(user_ids_cstr[i]);\n    }\n\n    Array p_stat_info = p_options->get(\"stat_info\");\n    int p_stat_info_size = p_stat_info.size();\n\n    EOS_Leaderboards_UserScoresQueryStatInfo *statInfo = (EOS_Leaderboards_UserScoresQueryStatInfo *)memalloc(sizeof(EOS_Leaderboards_UserScoresQueryStatInfo) * p_stat_info_size);\n\tPERSISTENT_CHAR_ARRAY_CREATE(stat_name_cstr, stat_name_cstr_charstrings, p_stat_info_size)\n    for (int i = 0; i < p_stat_info_size; i++) {\n\t\tPERSISTENT_CHAR_ARRAY_SET(stat_name_cstr, stat_name_cstr_charstrings, i, p_stat_info[i].get(\"stat_name\"));\n        int aggregation = static_cast<int>(p_stat_info[i].get(\"aggregation\"));\n        statInfo[i].ApiVersion = EOS_LEADERBOARDS_USERSCORESQUERYSTATINFO_API_LATEST;\n        statInfo[i].StatName = stat_name_cstr[i];\n        statInfo[i].Aggregation = static_cast<EOS_ELeaderboardAggregation>(aggregation);\n    }\n\n    EOS_Leaderboards_QueryLeaderboardUserScoresOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_LEADERBOARDS_QUERYLEADERBOARDUSERSCORES_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.UserIds = user_ids;\n    options.UserIdsCount = p_user_ids_size;\n    options.StatInfo = statInfo;\n    options.StatInfoCount = p_stat_info_size;\n    options.StartTime = static_cast<int64_t>(p_options->get(\"start_time\"));\n    options.EndTime = static_cast<int64_t>(p_options->get(\"end_time\"));\n    p_options->reference();\n\n    EOS_Leaderboards_QueryLeaderboardUserScores(s_leaderboardsInterface, &options, (void *)*p_options, [](const EOS_Leaderboards_OnQueryLeaderboardUserScoresCompleteCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        IEOS::get_singleton()->emit_signal(\"leaderboards_interface_query_leaderboard_user_scores_callback\", ret);\n    });\n}\n"
  },
  {
    "path": "src/lobby_interface.cpp",
    "content": "#include \"eosg_lobby_details.h\"\n#include \"godot_cpp/variant/utility_functions.hpp\"\n#include \"ieos.h\"\nusing namespace godot;\n\nvoid IEOS::lobby_interface_create_lobby(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_lobbyInterface);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString bucket_id = VARIANT_TO_CHARSTRING(p_options->get(\"bucket_id\"));\n    CharString lobby_id = VARIANT_TO_CHARSTRING(p_options->get(\"lobby_id\"));\n\tint rtc_room_join_action_type = p_options->get(\"rtc_room_join_action_type\");\n\n    EOS_Lobby_CreateLobbyOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_LOBBY_CREATELOBBY_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.MaxLobbyMembers = static_cast<uint32_t>(static_cast<int>(p_options->get(\"max_lobby_members\")));\n    options.PermissionLevel = static_cast<EOS_ELobbyPermissionLevel>(static_cast<int>(p_options->get(\"permission_level\")));\n    options.bPresenceEnabled = VARIANT_TO_EOS_BOOL(p_options->get(\"presence_enabled\"));\n    options.bAllowInvites = VARIANT_TO_EOS_BOOL(p_options->get(\"allow_invites\"));\n    options.BucketId = bucket_id.get_data();\n    options.bDisableHostMigration = VARIANT_TO_EOS_BOOL(p_options->get(\"disable_host_migration\"));\n    options.bEnableRTCRoom = VARIANT_TO_EOS_BOOL(p_options->get(\"enable_rtc_room\"));\n    options.bCrossplayOptOut = VARIANT_TO_EOS_BOOL(p_options->get(\"crossplay_opt_out\"));\n\toptions.RTCRoomJoinActionType = static_cast<EOS_ELobbyRTCRoomJoinActionType>(rtc_room_join_action_type);\n\n    Variant local_rtc_options = p_options->get(\"local_rtc_options\");\n    EOS_Lobby_LocalRTCOptions localRTCOptions;\n    memset(&localRTCOptions, 0, sizeof(localRTCOptions));\n    if (options.bEnableRTCRoom && local_rtc_options.get_type() != Variant::NIL) {\n        localRTCOptions = eosg_variant_to_lobby_local_rtc_options(local_rtc_options);\n        options.LocalRTCOptions = &localRTCOptions;\n    }\n    if (lobby_id.length() != 0) {\n        options.LobbyId = lobby_id.get_data();\n    }\n    options.bEnableJoinById = VARIANT_TO_EOS_BOOL(p_options->get(\"enable_join_by_id\"));\n    options.bRejoinAfterKickRequiresInvite = VARIANT_TO_EOS_BOOL(p_options->get(\"rejoin_after_kick_requires_invite\"));\n\n\tArray allowed_platform_ids = p_options->get(\"allowed_platform_ids\");\n\tuint32_t* allowedPlatformIds = nullptr;\n\tif (allowed_platform_ids.size() > 0) {\n\t\tfor (int i = 0; i < allowed_platform_ids.size(); i++) {\n\t\t\tallowedPlatformIds[i] = static_cast<uint32_t>(allowed_platform_ids[i]);\n\t\t}\n\t\toptions.AllowedPlatformIdsCount = allowed_platform_ids.size();\n\t\toptions.AllowedPlatformIds = allowedPlatformIds;\n\t}\n    p_options->reference();\n\n    EOS_Lobby_CreateLobby(s_lobbyInterface, &options, (void *)*p_options, [](const EOS_Lobby_CreateLobbyCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"lobby_id\"] = EOSG_GET_STRING(data->LobbyId);\n        IEOS::get_singleton()->emit_signal(\"lobby_interface_create_lobby_callback\", ret);\n    });\n}\n\nvoid IEOS::lobby_interface_join_rtc_room(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_lobbyInterface);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString lobby_id = VARIANT_TO_CHARSTRING(p_options->get(\"lobby_id\"));\n\n    EOS_Lobby_JoinRTCRoomOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_LOBBY_JOINRTCROOM_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.LobbyId = lobby_id.get_data();\n    Variant local_rtc_options = p_options->get(\"local_rtc_options\");\n    EOS_Lobby_LocalRTCOptions localRTCOptions;\n    memset(&localRTCOptions, 0, sizeof(localRTCOptions));\n    if (local_rtc_options.get_type() != Variant::NIL) {\n        localRTCOptions = eosg_variant_to_lobby_local_rtc_options(local_rtc_options);\n        options.LocalRTCOptions = &localRTCOptions;\n    }\n    p_options->reference();\n\n    EOS_Lobby_JoinRTCRoom(s_lobbyInterface, &options, (void *)*p_options, [](const EOS_Lobby_JoinRTCRoomCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"lobby_id\"] = EOSG_GET_STRING(data->LobbyId);\n        IEOS::get_singleton()->emit_signal(\"lobby_interface_join_rtc_room_callback\", ret);\n    });\n}\nvoid IEOS::lobby_interface_leave_rtc_room(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_lobbyInterface);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString lobby_id = VARIANT_TO_CHARSTRING(p_options->get(\"lobby_id\"));\n\n    EOS_Lobby_LeaveRTCRoomOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_LOBBY_LEAVERTCROOM_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.LobbyId = lobby_id.get_data();\n    p_options->reference();\n\n    EOS_Lobby_LeaveRTCRoom(s_lobbyInterface, &options, (void *)*p_options, [](const EOS_Lobby_LeaveRTCRoomCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"lobby_id\"] = EOSG_GET_STRING(data->LobbyId);\n        IEOS::get_singleton()->emit_signal(\"lobby_interface_leave_rtc_room_callback\", ret);\n    });\n}\n\nvoid IEOS::lobby_interface_destroy_lobby(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_lobbyInterface);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString lobby_id = VARIANT_TO_CHARSTRING(p_options->get(\"lobby_id\"));\n\n    EOS_Lobby_DestroyLobbyOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_LOBBY_DESTROYLOBBY_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.LobbyId = lobby_id.get_data();\n    p_options->reference();\n\n    EOS_Lobby_DestroyLobby(s_lobbyInterface, &options, (void *)*p_options, [](const EOS_Lobby_DestroyLobbyCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"lobby_id\"] = EOSG_GET_STRING(data->LobbyId);\n        IEOS::get_singleton()->emit_signal(\"lobby_interface_destroy_lobby_callback\", ret);\n    });\n}\n\nvoid IEOS::lobby_interface_join_lobby(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_lobbyInterface);\n    Ref<EOSGLobbyDetails> p_lobby_details = Object::cast_to<EOSGLobbyDetails>(p_options->get(\"lobby_details\"));\n    ERR_FAIL_NULL_MSG(p_lobby_details, \"Error joining lobby. JoinLobbyOptions.lobby_details is null.\");\n    ERR_FAIL_NULL_MSG(p_lobby_details->get_internal(), \"Error joining lobby. EOSGLobbyDetails is null.\");\n\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n\tint rtc_room_join_action_type = p_options->get(\"rtc_room_join_action_type\");\n\n    EOS_Lobby_JoinLobbyOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_LOBBY_JOINLOBBY_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.bPresenceEnabled = VARIANT_TO_EOS_BOOL(p_options->get(\"presence_enabled\"));\n\toptions.RTCRoomJoinActionType = static_cast<EOS_ELobbyRTCRoomJoinActionType>(rtc_room_join_action_type);\n    Variant local_rtc_options = p_options->get(\"local_rtc_options\");\n    EOS_Lobby_LocalRTCOptions localRTCOptions;\n    memset(&localRTCOptions, 0, sizeof(localRTCOptions));\n    if (local_rtc_options.get_type() != Variant::NIL) {\n        localRTCOptions = eosg_variant_to_lobby_local_rtc_options(local_rtc_options);\n        options.LocalRTCOptions = &localRTCOptions;\n    }\n    options.LobbyDetailsHandle = p_lobby_details->get_internal();\n    p_options->reference();\n\n    EOS_Lobby_JoinLobby(s_lobbyInterface, &options, (void *)*p_options, [](const EOS_Lobby_JoinLobbyCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"lobby_id\"] = EOSG_GET_STRING(data->LobbyId);\n        IEOS::get_singleton()->emit_signal(\"lobby_interface_join_lobby_callback\", ret);\n    });\n}\n\nvoid IEOS::lobby_interface_join_lobby_by_id(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_lobbyInterface);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString lobby_id = VARIANT_TO_CHARSTRING(p_options->get(\"lobby_id\"));\n\tint rtc_room_join_action_type = p_options->get(\"rtc_room_join_action_type\");\n\n    EOS_Lobby_JoinLobbyByIdOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_LOBBY_JOINLOBBYBYID_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.LobbyId = lobby_id.get_data();\n    options.bPresenceEnabled = VARIANT_TO_EOS_BOOL(p_options->get(\"presence_enabled\"));\n\toptions.RTCRoomJoinActionType = static_cast<EOS_ELobbyRTCRoomJoinActionType>(rtc_room_join_action_type);\n    Variant local_rtc_options = p_options->get(\"local_rtc_options\");\n    EOS_Lobby_LocalRTCOptions localRTCOptions;\n    memset(&localRTCOptions, 0, sizeof(localRTCOptions));\n    if (local_rtc_options.get_type() != Variant::NIL) {\n        localRTCOptions = eosg_variant_to_lobby_local_rtc_options(local_rtc_options);\n        options.LocalRTCOptions = &localRTCOptions;\n    }\n    p_options->reference();\n\n    EOS_Lobby_JoinLobbyById(s_lobbyInterface, &options, (void *)*p_options, [](const EOS_Lobby_JoinLobbyByIdCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"lobby_id\"] = EOSG_GET_STRING(data->LobbyId);\n        IEOS::get_singleton()->emit_signal(\"lobby_interface_join_lobby_by_id_callback\", ret);\n    });\n}\n\nvoid IEOS::lobby_interface_leave_lobby(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_lobbyInterface);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString lobby_id = VARIANT_TO_CHARSTRING(p_options->get(\"lobby_id\"));\n\n    EOS_Lobby_LeaveLobbyOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_LOBBY_LEAVELOBBY_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.LobbyId = lobby_id.get_data();\n    p_options->reference();\n\n    EOS_Lobby_LeaveLobby(s_lobbyInterface, &options, (void *)*p_options, [](const EOS_Lobby_LeaveLobbyCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"lobby_id\"] = EOSG_GET_STRING(data->LobbyId);\n        IEOS::get_singleton()->emit_signal(\"lobby_interface_leave_lobby_callback\", ret);\n    });\n}\n\nDictionary IEOS::lobby_interface_update_lobby_modification(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_lobbyInterface, {});\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString lobby_id = VARIANT_TO_CHARSTRING(p_options->get(\"lobby_id\"));\n\n    EOS_Lobby_UpdateLobbyModificationOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_LOBBY_UPDATELOBBYMODIFICATION_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.LobbyId = lobby_id.get_data();\n\n    EOS_HLobbyModification outLobbyModification = nullptr;\n    EOS_EResult res = EOS_Lobby_UpdateLobbyModification(s_lobbyInterface, &options, &outLobbyModification);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"lobby_modification\"] = eosg_lobby_lobby_modification_to_wrapper(outLobbyModification);\n    return ret;\n}\n\nvoid IEOS::lobby_interface_update_lobby(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_lobbyInterface);\n    Ref<EOSGLobbyModification> lobby_modification = Object::cast_to<EOSGLobbyModification>(p_options->get(\"lobby_modification\"));\n    ERR_FAIL_NULL_MSG(lobby_modification, \"Error updating lobby. UpdateLobbyOptions.lobby_modification is null.\");\n    ERR_FAIL_NULL_MSG(lobby_modification->get_internal(), \"Error updating lobby. EOSGLobbyModification is null.\");\n\n    EOS_Lobby_UpdateLobbyOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_LOBBY_UPDATELOBBY_API_LATEST;\n    options.LobbyModificationHandle = lobby_modification->get_internal();\n    p_options->reference();\n    lobby_modification->reference();\n\n    EOS_Lobby_UpdateLobby(s_lobbyInterface, &options, (void *)*p_options, [](const EOS_Lobby_UpdateLobbyCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n\n        Ref<EOSGLobbyModification> got_lobby_modification = Object::cast_to<EOSGLobbyModification>(client_data->get(\"lobby_modification\"));\n        got_lobby_modification->unreference();\n\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"lobby_id\"] = EOSG_GET_STRING(data->LobbyId);\n        IEOS::get_singleton()->emit_signal(\"lobby_interface_update_lobby_callback\", ret);\n    });\n}\n\nvoid IEOS::lobby_interface_promote_member(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_lobbyInterface);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString target_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"target_user_id\"));\n    CharString lobby_id = VARIANT_TO_CHARSTRING(p_options->get(\"lobby_id\"));\n\n    EOS_Lobby_PromoteMemberOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_LOBBY_PROMOTEMEMBER_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.TargetUserId = eosg_string_to_product_user_id(target_user_id.get_data());\n    options.LobbyId = lobby_id.get_data();\n    p_options->reference();\n\n    EOS_Lobby_PromoteMember(s_lobbyInterface, &options, (void *)*p_options, [](const EOS_Lobby_PromoteMemberCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"lobby_id\"] = EOSG_GET_STRING(data->LobbyId);\n        IEOS::get_singleton()->emit_signal(\"lobby_interface_promote_member_callback\", ret);\n    });\n}\n\nvoid IEOS::lobby_interface_kick_member(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_lobbyInterface);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString target_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"target_user_id\"));\n    CharString lobby_id = VARIANT_TO_CHARSTRING(p_options->get(\"lobby_id\"));\n\n    EOS_Lobby_KickMemberOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_LOBBY_KICKMEMBER_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.TargetUserId = eosg_string_to_product_user_id(target_user_id.get_data());\n    options.LobbyId = lobby_id.get_data();\n    p_options->reference();\n\n    EOS_Lobby_KickMember(s_lobbyInterface, &options, (void *)*p_options, [](const EOS_Lobby_KickMemberCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"lobby_id\"] = EOSG_GET_STRING(data->LobbyId);\n        IEOS::get_singleton()->emit_signal(\"lobby_interface_kick_member_callback\", ret);\n    });\n}\n\nvoid IEOS::lobby_interface_hard_mute_member(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_lobbyInterface);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString target_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"target_user_id\"));\n    CharString lobby_id = VARIANT_TO_CHARSTRING(p_options->get(\"lobby_id\"));\n\n    EOS_Lobby_HardMuteMemberOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_LOBBY_HARDMUTEMEMBER_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.TargetUserId = eosg_string_to_product_user_id(target_user_id.get_data());\n    options.LobbyId = lobby_id.get_data();\n    options.bHardMute = VARIANT_TO_EOS_BOOL(p_options->get(\"hard_mute\"));\n    p_options->reference();\n\n    EOS_Lobby_HardMuteMember(s_lobbyInterface, &options, (void *)*p_options, [](const EOS_Lobby_HardMuteMemberCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"lobby_id\"] = EOSG_GET_STRING(data->LobbyId);\n        ret[\"target_user_id\"] = eosg_product_user_id_to_string(data->TargetUserId);\n        IEOS::get_singleton()->emit_signal(\"lobby_interface_hard_mute_member_callback\", ret);\n    });\n}\n\nvoid IEOS::lobby_interface_send_invite(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_lobbyInterface);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString target_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"target_user_id\"));\n    CharString lobby_id = VARIANT_TO_CHARSTRING(p_options->get(\"lobby_id\"));\n\n    EOS_Lobby_SendInviteOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_LOBBY_SENDINVITE_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.TargetUserId = eosg_string_to_product_user_id(target_user_id.get_data());\n    options.LobbyId = lobby_id.get_data();\n    p_options->reference();\n\n    EOS_Lobby_SendInvite(s_lobbyInterface, &options, (void *)*p_options, [](const EOS_Lobby_SendInviteCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"lobby_id\"] = EOSG_GET_STRING(data->LobbyId);\n        IEOS::get_singleton()->emit_signal(\"lobby_interface_send_invite_callback\", ret);\n    });\n}\n\nvoid IEOS::lobby_interface_reject_invite(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_lobbyInterface);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString invite_id = VARIANT_TO_CHARSTRING(p_options->get(\"invite_id\"));\n\n    EOS_Lobby_RejectInviteOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_LOBBY_REJECTINVITE_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.InviteId = invite_id.get_data();\n    p_options->reference();\n\n    EOS_Lobby_RejectInvite(s_lobbyInterface, &options, (void *)*p_options, [](const EOS_Lobby_RejectInviteCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"invite_id\"] = EOSG_GET_STRING(data->InviteId);\n        IEOS::get_singleton()->emit_signal(\"lobby_interface_reject_invite_callback\", ret);\n    });\n}\n\nvoid IEOS::lobby_interface_query_invites(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_lobbyInterface);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n\n    EOS_Lobby_QueryInvitesOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_LOBBY_QUERYINVITES_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    p_options->reference();\n\n    EOS_Lobby_QueryInvites(s_lobbyInterface, &options, (void *)*p_options, [](const EOS_Lobby_QueryInvitesCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n        IEOS::get_singleton()->emit_signal(\"lobby_interface_query_invites_callback\", ret);\n    });\n}\n\nint IEOS::lobby_interface_get_invite_count(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_lobbyInterface, 0);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n\n    EOS_Lobby_GetInviteCountOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_LOBBY_GETINVITECOUNT_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n\n    return static_cast<int>(EOS_Lobby_GetInviteCount(s_lobbyInterface, &options));\n}\n\nDictionary IEOS::lobby_interface_get_invite_id_by_index(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_lobbyInterface, {});\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n\n    EOS_Lobby_GetInviteIdByIndexOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_LOBBY_GETINVITEIDBYINDEX_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.Index = static_cast<uint32_t>(static_cast<int>(p_options->get(\"index\")));\n\n    char *outBuffer = (char *)memalloc(EOS_LOBBY_INVITEID_MAX_LENGTH + 1);\n    int outBufferSize = EOS_LOBBY_INVITEID_MAX_LENGTH + 1;\n    EOS_EResult result = EOS_Lobby_GetInviteIdByIndex(s_lobbyInterface, &options, outBuffer, &outBufferSize);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(result);\n    ret[\"invite_id\"] = EOSG_GET_STRING(outBuffer);\n    return ret;\n}\n\nDictionary IEOS::lobby_interface_create_lobby_search(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_lobbyInterface, {});\n    EOS_Lobby_CreateLobbySearchOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_LOBBY_CREATELOBBYSEARCH_API_LATEST;\n    options.MaxResults = static_cast<uint32_t>(static_cast<int>(p_options->get(\"max_results\")));\n\n    EOS_HLobbySearch outLobbySearch = nullptr;\n    EOS_EResult res = EOS_Lobby_CreateLobbySearch(s_lobbyInterface, &options, &outLobbySearch);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"lobby_search\"] = eosg_lobby_lobby_search_to_wrapper(outLobbySearch);\n    return ret;\n}\n\nDictionary IEOS::lobby_interface_copy_lobby_details_by_invite_id(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_lobbyInterface, {});\n    CharString invite_id = VARIANT_TO_CHARSTRING(p_options->get(\"invite_id\"));\n\n    EOS_Lobby_CopyLobbyDetailsHandleByInviteIdOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_LOBBY_COPYLOBBYDETAILSHANDLEBYINVITEID_API_LATEST;\n    options.InviteId = invite_id.get_data();\n\n    EOS_HLobbyDetails outLobbyDetails = nullptr;\n    EOS_EResult res = EOS_Lobby_CopyLobbyDetailsHandleByInviteId(s_lobbyInterface, &options, &outLobbyDetails);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"lobby_details\"] = eosg_lobby_lobby_details_to_wrapper(outLobbyDetails);\n    return ret;\n}\n\nDictionary IEOS::lobby_interface_copy_lobby_details_by_ui_event_id(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_lobbyInterface, {});\n    EOS_Lobby_CopyLobbyDetailsHandleByUiEventIdOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_LOBBY_COPYLOBBYDETAILSHANDLEBYUIEVENTID_API_LATEST;\n    options.UiEventId = static_cast<uint64_t>(static_cast<int>(p_options->get(\"ui_event_id\")));\n\n    EOS_HLobbyDetails outLobbyDetails = nullptr;\n    EOS_EResult res = EOS_Lobby_CopyLobbyDetailsHandleByUiEventId(s_lobbyInterface, &options, &outLobbyDetails);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"lobby_details\"] = eosg_lobby_lobby_details_to_wrapper(outLobbyDetails);\n    return ret;\n}\n\nDictionary IEOS::lobby_interface_copy_lobby_details(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_lobbyInterface, {});\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString lobby_id = VARIANT_TO_CHARSTRING(p_options->get(\"lobby_id\"));\n\n    EOS_Lobby_CopyLobbyDetailsHandleOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_LOBBY_COPYLOBBYDETAILSHANDLE_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.LobbyId = lobby_id.get_data();\n\n    EOS_HLobbyDetails outLobbyDetails = nullptr;\n    EOS_EResult res = EOS_Lobby_CopyLobbyDetailsHandle(s_lobbyInterface, &options, &outLobbyDetails);\n\n    Variant lobby_details = eosg_lobby_lobby_details_to_wrapper(outLobbyDetails);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"lobby_details\"] = lobby_details;\n    return ret;\n}\n\nDictionary IEOS::lobby_interface_get_rtc_room_name(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_lobbyInterface, {});\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString lobby_id = VARIANT_TO_CHARSTRING(p_options->get(\"lobby_id\"));\n\n    EOS_Lobby_GetRTCRoomNameOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_LOBBY_GETRTCROOMNAME_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.LobbyId = lobby_id.get_data();\n\n    char *outBuffer = (char *)memalloc(256); // TODO: what is the actual max size for the outBuffer?\n    uint32_t outBufferSize = 256;\n    EOS_EResult res = EOS_Lobby_GetRTCRoomName(s_lobbyInterface, &options, outBuffer, &outBufferSize);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"rtc_room_name\"] = EOSG_GET_STRING(outBuffer);\n\n    return ret;\n}\n\nDictionary IEOS::lobby_interface_is_rtc_room_connected(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_lobbyInterface, {});\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString lobby_id = VARIANT_TO_CHARSTRING(p_options->get(\"lobby_id\"));\n\n    EOS_Lobby_IsRTCRoomConnectedOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_LOBBY_ISRTCROOMCONNECTED_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.LobbyId = lobby_id.get_data();\n\n    EOS_Bool outIsConnected = EOS_FALSE;\n    EOS_EResult res = EOS_Lobby_IsRTCRoomConnected(s_lobbyInterface, &options, &outIsConnected);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"is_connected\"] = EOSG_GET_BOOL(outIsConnected);\n    return ret;\n}\n\nDictionary IEOS::lobby_interface_get_connect_string(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_lobbyInterface, {});\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString lobby_id = VARIANT_TO_CHARSTRING(p_options->get(\"lobby_id\"));\n\n    EOS_Lobby_GetConnectStringOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_LOBBY_GETCONNECTSTRING_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.LobbyId = lobby_id.get_data();\n\n    char *OutBuffer = (char *)memalloc(EOS_LOBBY_GETCONNECTSTRING_BUFFER_SIZE + 1);\n    uint32_t OutBufferLength = 0;\n    EOS_EResult res = EOS_Lobby_GetConnectString(s_lobbyInterface, &options, OutBuffer, &OutBufferLength);\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    if (res == EOS_EResult::EOS_Success) {\n        ret[\"connect_string\"] = EOSG_GET_STRING(OutBuffer);\n    } else {\n        ret[\"connect_string\"] = String(\"\");\n    }\n\n    return ret;\n}\n\nDictionary IEOS::lobby_interface_parse_connect_string(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_lobbyInterface, {});\n    CharString connect_string = VARIANT_TO_CHARSTRING(p_options->get(\"connect_string\"));\n\n    EOS_Lobby_ParseConnectStringOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_LOBBY_PARSECONNECTSTRING_API_LATEST;\n    options.ConnectString = connect_string.get_data();\n\n    char *OutBuffer = (char *)memalloc(EOS_LOBBY_PARSECONNECTSTRING_BUFFER_SIZE + 1);\n    uint32_t OutBufferLength = 0;\n    EOS_EResult res = EOS_Lobby_ParseConnectString(s_lobbyInterface, &options, OutBuffer, &OutBufferLength);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    if (res == EOS_EResult::EOS_Success) {\n        ret[\"lobby_id\"] = EOSG_GET_STRING(OutBuffer);\n    } else {\n        ret[\"lobby_id\"] = String(\"\");\n    }\n\n    return ret;\n}"
  },
  {
    "path": "src/logging_interface.cpp",
    "content": "#include \"ieos.h\"\nusing namespace godot;\n\nint IEOS::logging_interface_set_log_level(int category, int level) {\n    EOS_EResult result = EOS_Logging_SetLogLevel(static_cast<EOS_ELogCategory>(category), static_cast<EOS_ELogLevel>(level));\n    return static_cast<int>(result);\n}\n"
  },
  {
    "path": "src/metrics_interface.cpp",
    "content": "#include \"ieos.h\"\nusing namespace std;\n\nint IEOS::metrics_interface_begin_player_session(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_metricsInterface, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    CharString account_id = VARIANT_TO_CHARSTRING(p_options->get(\"account_id\"));\n    CharString display_name = VARIANT_TO_CHARSTRING(p_options->get(\"display_name\"));\n    CharString server_ip = VARIANT_TO_CHARSTRING(p_options->get(\"server_ip\"));\n    CharString game_session_id = VARIANT_TO_CHARSTRING(p_options->get(\"game_session_id\"));\n\n    EOS_Metrics_BeginPlayerSessionOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_METRICS_BEGINPLAYERSESSION_API_LATEST;\n    options.AccountIdType = static_cast<EOS_EMetricsAccountIdType>(static_cast<int>(p_options->get(\"account_id_type\")));\n    options.DisplayName = display_name.get_data();\n    options.ControllerType = static_cast<EOS_EUserControllerType>(static_cast<int>(p_options->get(\"controller_type\")));\n\n    if (options.AccountIdType == EOS_EMetricsAccountIdType::EOS_MAIT_Epic) {\n        options.AccountId.Epic = eosg_string_to_epic_account_id(account_id.get_data());\n    } else if (options.AccountIdType == EOS_EMetricsAccountIdType::EOS_MAIT_External) {\n        options.AccountId.External = account_id.get_data();\n    }\n    if (server_ip.length() != 0) {\n        options.ServerIp = server_ip.get_data();\n    }\n    if (game_session_id.length() != 0) {\n        options.GameSessionId = game_session_id.get_data();\n    }\n\n    return static_cast<int>(EOS_Metrics_BeginPlayerSession(s_metricsInterface, &options));\n}\n\nint IEOS::metrics_interface_end_player_session(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_metricsInterface, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    CharString account_id = VARIANT_TO_CHARSTRING(p_options->get(\"account_id\"));\n\n    EOS_Metrics_EndPlayerSessionOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_METRICS_ENDPLAYERSESSION_API_LATEST;\n    options.AccountIdType = static_cast<EOS_EMetricsAccountIdType>(static_cast<int>(p_options->get(\"account_id_type\")));\n\n    if (options.AccountIdType == EOS_EMetricsAccountIdType::EOS_MAIT_Epic) {\n        options.AccountId.Epic = eosg_string_to_epic_account_id(account_id.get_data());\n    } else if (options.AccountIdType == EOS_EMetricsAccountIdType::EOS_MAIT_External) {\n        options.AccountId.External = account_id.get_data();\n    }\n\n    return static_cast<int>(EOS_Metrics_EndPlayerSession(s_metricsInterface, &options));\n}\n"
  },
  {
    "path": "src/mods_interface.cpp",
    "content": "#include \"ieos.h\"\nusing namespace std;\n\nDictionary IEOS::mods_interface_copy_mod_info(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_modsInterface, {});\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n\n    EOS_Mods_CopyModInfoOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_MODS_COPYMODINFO_API_LATEST;\n    options.LocalUserId = eosg_string_to_epic_account_id(local_user_id.get_data());\n    options.Type = static_cast<EOS_EModEnumerationType>(static_cast<int>(p_options->get(\"type\")));\n\n    EOS_Mods_ModInfo *outEnumeratedMods = nullptr;\n    EOS_EResult res = EOS_Mods_CopyModInfo(s_modsInterface, &options, &outEnumeratedMods);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"mods\"] = eosg_mods_mod_info_to_dict_and_release(outEnumeratedMods);\n    return ret;\n}\n\nvoid IEOS::mods_interface_enumerate_mods(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_modsInterface);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n\n    EOS_Mods_EnumerateModsOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_MODS_ENUMERATEMODS_API_LATEST;\n    options.LocalUserId = eosg_string_to_epic_account_id(local_user_id.get_data());\n    options.Type = static_cast<EOS_EModEnumerationType>(static_cast<int>(p_options->get(\"type\")));\n    p_options->reference();\n\n    EOS_Mods_EnumerateMods(s_modsInterface, &options, (void *)*p_options, [](const EOS_Mods_EnumerateModsCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"local_user_id\"] = eosg_epic_account_id_to_string(data->LocalUserId);\n        ret[\"type\"] = static_cast<int>(data->Type);\n        IEOS::get_singleton()->emit_signal(\"mods_interface_enumerate_mods_callback\", ret);\n    });\n}\n\nvoid IEOS::mods_interface_install_mod(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_modsInterface);\n    Dictionary p_mod = p_options->get(\"mod\");\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n\n    CharString mod_namespace_id = VARIANT_TO_CHARSTRING(p_mod[\"namespace_id\"]);\n    CharString mod_item_id = VARIANT_TO_CHARSTRING(p_mod[\"item_id\"]);\n    CharString mod_artifact_id = VARIANT_TO_CHARSTRING(p_mod[\"artifact_id\"]);\n    CharString mod_title = VARIANT_TO_CHARSTRING(p_mod[\"title\"]);\n    CharString mod_version = VARIANT_TO_CHARSTRING(p_mod[\"version\"]);\n\n    EOS_Mod_Identifier mod;\n    memset(&mod, 0, sizeof(mod));\n    mod.ApiVersion = EOS_MOD_IDENTIFIER_API_LATEST;\n    mod.NamespaceId = mod_namespace_id.get_data();\n    mod.ItemId = mod_item_id.get_data();\n    mod.ArtifactId = mod_artifact_id.get_data();\n    mod.Title = mod_title.get_data();\n    mod.Version = mod_version.get_data();\n\n    EOS_Mods_InstallModOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_MODS_INSTALLMOD_API_LATEST;\n    options.LocalUserId = eosg_string_to_epic_account_id(local_user_id.get_data());\n    options.Mod = &mod;\n    options.bRemoveAfterExit = VARIANT_TO_EOS_BOOL(p_options->get(\"remove_after_exit\"));\n    p_options->reference();\n\n    EOS_Mods_InstallMod(s_modsInterface, &options, (void *)*p_options, [](const EOS_Mods_InstallModCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"local_user_id\"] = eosg_epic_account_id_to_string(data->LocalUserId);\n        ret[\"mod\"] = eosg_mods_mod_identifier_to_dict(data->Mod);\n        IEOS::get_singleton()->emit_signal(\"mods_interface_install_mod_callback\", ret);\n    });\n}\n\nvoid IEOS::mods_interface_uninstall_mod(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_modsInterface);\n    Dictionary p_mod = p_options->get(\"mod\");\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n\n    CharString mod_namespace_id = VARIANT_TO_CHARSTRING(p_mod[\"namespace_id\"]);\n    CharString mod_item_id = VARIANT_TO_CHARSTRING(p_mod[\"item_id\"]);\n    CharString mod_artifact_id = VARIANT_TO_CHARSTRING(p_mod[\"artifact_id\"]);\n    CharString mod_title = VARIANT_TO_CHARSTRING(p_mod[\"title\"]);\n    CharString mod_version = VARIANT_TO_CHARSTRING(p_mod[\"version\"]);\n\n    EOS_Mod_Identifier mod;\n    memset(&mod, 0, sizeof(mod));\n    mod.ApiVersion = EOS_MOD_IDENTIFIER_API_LATEST;\n    mod.NamespaceId = mod_namespace_id.get_data();\n    mod.ItemId = mod_item_id.get_data();\n    mod.ArtifactId = mod_artifact_id.get_data();\n    mod.Title = mod_title.get_data();\n    mod.Version = mod_version.get_data();\n\n    EOS_Mods_UninstallModOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_MODS_UNINSTALLMOD_API_LATEST;\n    options.LocalUserId = eosg_string_to_epic_account_id(local_user_id.get_data());\n    options.Mod = &mod;\n    p_options->reference();\n\n    EOS_Mods_UninstallMod(s_modsInterface, &options, (void *)*p_options, [](const EOS_Mods_UninstallModCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"local_user_id\"] = eosg_epic_account_id_to_string(data->LocalUserId);\n        ret[\"mod\"] = eosg_mods_mod_identifier_to_dict(data->Mod);\n        IEOS::get_singleton()->emit_signal(\"mods_interface_uninstall_mod_callback\", ret);\n    });\n}\n\nvoid IEOS::mods_interface_update_mod(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_modsInterface);\n    Dictionary p_mod = p_options->get(\"mod\");\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n\n    CharString mod_namespace_id = VARIANT_TO_CHARSTRING(p_mod[\"namespace_id\"]);\n    CharString mod_item_id = VARIANT_TO_CHARSTRING(p_mod[\"item_id\"]);\n    CharString mod_artifact_id = VARIANT_TO_CHARSTRING(p_mod[\"artifact_id\"]);\n    CharString mod_title = VARIANT_TO_CHARSTRING(p_mod[\"title\"]);\n    CharString mod_version = VARIANT_TO_CHARSTRING(p_mod[\"version\"]);\n\n    EOS_Mod_Identifier mod;\n    memset(&mod, 0, sizeof(mod));\n    mod.ApiVersion = EOS_MOD_IDENTIFIER_API_LATEST;\n    mod.NamespaceId = mod_namespace_id.get_data();\n    mod.ItemId = mod_item_id.get_data();\n    mod.ArtifactId = mod_artifact_id.get_data();\n    mod.Title = mod_title.get_data();\n    mod.Version = mod_version.get_data();\n\n    EOS_Mods_UpdateModOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_MODS_UPDATEMOD_API_LATEST;\n    options.LocalUserId = eosg_string_to_epic_account_id(local_user_id.get_data());\n    options.Mod = &mod;\n    p_options->reference();\n\n    EOS_Mods_UpdateMod(s_modsInterface, &options, (void *)*p_options, [](const EOS_Mods_UpdateModCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"local_user_id\"] = eosg_epic_account_id_to_string(data->LocalUserId);\n        ret[\"mod\"] = eosg_mods_mod_identifier_to_dict(data->Mod);\n        IEOS::get_singleton()->emit_signal(\"mods_interface_update_mod_callback\", ret);\n    });\n}\n"
  },
  {
    "path": "src/p2p_interface.cpp",
    "content": "#include \"ieos.h\"\n\nvoid IEOS::p2p_interface_query_nat_type() {\n    ERR_FAIL_NULL(s_p2pInterface);\n    EOS_P2P_QueryNATTypeOptions options = { 0 };\n    options.ApiVersion = EOS_P2P_QUERYNATTYPE_API_LATEST;\n    EOS_P2P_QueryNATType(s_p2pInterface, &options, nullptr, [](const EOS_P2P_OnQueryNATTypeCompleteInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        ret[\"nat_type\"] = static_cast<int>(data->NATType);\n        get_singleton()->emit_signal(\"p2p_interface_query_nat_type_callback\", ret);\n    });\n}\n\nDictionary IEOS::p2p_interface_get_nat_type() {\n    ERR_FAIL_NULL_V(s_p2pInterface, Dictionary());\n    EOS_P2P_GetNATTypeOptions options = { 0 };\n    options.ApiVersion = EOS_P2P_GETNATTYPE_API_LATEST;\n\n    EOS_ENATType nat_type = EOS_ENATType::EOS_NAT_Unknown;\n    EOS_EResult res = EOS_P2P_GetNATType(s_p2pInterface, &options, &nat_type);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    if (res == EOS_EResult::EOS_Success) {\n        ret[\"nat_type\"] = static_cast<int>(nat_type);\n    } else {\n        ret[\"nat_type\"] = static_cast<int>(EOS_ENATType::EOS_NAT_Unknown);\n    }\n\n    return ret;\n}\n\nint IEOS::p2p_interface_set_relay_control(int control) {\n    ERR_FAIL_NULL_V(s_p2pInterface, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    EOS_ERelayControl relay_control = static_cast<EOS_ERelayControl>(control);\n    EOS_P2P_SetRelayControlOptions options = { 0 };\n    options.ApiVersion = EOS_P2P_SETRELAYCONTROL_API_LATEST;\n    options.RelayControl = relay_control;\n    return static_cast<int>(EOS_P2P_SetRelayControl(s_p2pInterface, &options));\n}\n\nDictionary IEOS::p2p_interface_get_relay_control() {\n    ERR_FAIL_NULL_V(s_p2pInterface, Dictionary());\n    EOS_P2P_GetRelayControlOptions options = { 0 };\n    options.ApiVersion = EOS_P2P_GETRELAYCONTROL_API_LATEST;\n\n    EOS_ERelayControl relay_control;\n    EOS_EResult res = EOS_P2P_GetRelayControl(s_p2pInterface, &options, &relay_control);\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    if (res == EOS_EResult::EOS_Success) {\n        ret[\"relay_control\"] = static_cast<int>(relay_control);\n    } else {\n        ret[\"relay_control\"] = static_cast<int>(EOS_ERelayControl::EOS_RC_NoRelays);\n    }\n    return ret;\n}\n\nint IEOS::p2p_interface_set_port_range(Ref<RefCounted> options) {\n    ERR_FAIL_NULL_V(s_p2pInterface, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    int port = options->get(\"port\");\n    int max_additional_ports_to_try = options->get(\"max_additional_ports_to_try\");\n    EOS_P2P_SetPortRangeOptions set_port_range_options = { 0 };\n    set_port_range_options.ApiVersion = EOS_P2P_SETPORTRANGE_API_LATEST;\n    set_port_range_options.Port = port;\n    set_port_range_options.MaxAdditionalPortsToTry = max_additional_ports_to_try;\n    return static_cast<int>(EOS_P2P_SetPortRange(s_p2pInterface, &set_port_range_options));\n}\n\nDictionary IEOS::p2p_interface_get_port_range() {\n    ERR_FAIL_NULL_V(s_p2pInterface, {});\n    EOS_P2P_GetPortRangeOptions options = { 0 };\n    options.ApiVersion = EOS_P2P_GETPORTRANGE_API_LATEST;\n\n    uint16_t port;\n    uint16_t max_additional_ports_to_try;\n    EOS_EResult res = EOS_P2P_GetPortRange(s_p2pInterface, &options, &port, &max_additional_ports_to_try);\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    if (res != EOS_EResult::EOS_Success) {\n        ret[\"port\"] = port;\n        ret[\"max_additional_ports_to_try\"] = max_additional_ports_to_try;\n    } else {\n        ret[\"port\"] = 0;\n        ret[\"max_additional_ports_to_try\"] = 0;\n    }\n    return ret;\n}\n\nint IEOS::p2p_interface_set_packet_queue_size(Ref<RefCounted> options) {\n    ERR_FAIL_NULL_V(s_p2pInterface, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    uint64_t incoming_packet_queue_max_size_bytes = options->get(\"incoming_packet_queue_max_size_bytes\");\n    uint64_t outgoing_packet_queue_max_size_bytes = options->get(\"outgoing_packet_queue_max_size_bytes\");\n    EOS_P2P_SetPacketQueueSizeOptions set_packet_queue_options;\n    set_packet_queue_options.ApiVersion = EOS_P2P_SETPACKETQUEUESIZE_API_LATEST;\n    set_packet_queue_options.IncomingPacketQueueMaxSizeBytes = incoming_packet_queue_max_size_bytes;\n    set_packet_queue_options.OutgoingPacketQueueMaxSizeBytes = outgoing_packet_queue_max_size_bytes;\n    return static_cast<int>(EOS_P2P_SetPacketQueueSize(s_p2pInterface, &set_packet_queue_options));\n}\n\nDictionary IEOS::p2p_interface_get_packet_queue_info() {\n    ERR_FAIL_NULL_V(s_p2pInterface, {});\n    EOS_P2P_GetPacketQueueInfoOptions options = { 0 };\n    options.ApiVersion = EOS_P2P_GETPACKETQUEUEINFO_API_LATEST;\n\n    EOS_P2P_PacketQueueInfo info;\n    EOS_EResult res = EOS_P2P_GetPacketQueueInfo(s_p2pInterface, &options, &info);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"incoming_packet_queue_current_packet_count\"] = info.IncomingPacketQueueCurrentPacketCount;\n    ret[\"incoming_packet_queue_current_size_bytes\"] = info.IncomingPacketQueueCurrentSizeBytes;\n    ret[\"incoming_packet_queue_max_size_bytes\"] = info.IncomingPacketQueueMaxSizeBytes;\n    ret[\"outgoing_packet_queue_current_packet_count\"] = info.OutgoingPacketQueueCurrentPacketCount;\n    ret[\"outgoing_packet_queue_current_size_bytes\"] = info.OutgoingPacketQueueCurrentSizeBytes;\n    ret[\"outgoing_packet_queue_max_size_bytes\"] = info.OutgoingPacketQueueMaxSizeBytes;\n    return ret;\n}\n\nEOS_EResult IEOS::_p2p_send_packet(const EOS_P2P_SendPacketOptions *options) {\n    if (s_p2pInterface == nullptr) return EOS_EResult::EOS_InvalidParameters;\n    EOS_EResult result = EOS_P2P_SendPacket(s_p2pInterface, options);\n    return result;\n}\n\nEOS_EResult IEOS::_p2p_receive_packet(const EOS_P2P_ReceivePacketOptions *options, void *out_packet_data, uint32_t *out_packet_size,\n        uint8_t *out_channel, EOS_ProductUserId *out_remote_user, EOS_P2P_SocketId *out_socket) {\n    if (s_p2pInterface == nullptr) return EOS_EResult::EOS_InvalidParameters;\n    EOS_EResult result = EOS_P2P_ReceivePacket(s_p2pInterface, options, out_remote_user, out_socket,\n            out_channel, out_packet_data, out_packet_size);\n    return result;\n}\n\nEOS_EResult IEOS::_p2p_accept_connection(const EOS_P2P_AcceptConnectionOptions *options) {\n    if (s_p2pInterface == nullptr) return EOS_EResult::EOS_InvalidParameters;\n    EOS_EResult result = EOS_P2P_AcceptConnection(s_p2pInterface, options);\n    return result;\n}\n\nEOS_EResult IEOS::_p2p_close_connection(const EOS_P2P_CloseConnectionOptions *options) {\n    if (s_p2pInterface == nullptr) return EOS_EResult::EOS_InvalidParameters;\n    EOS_EResult result = EOS_P2P_CloseConnection(s_p2pInterface, options);\n    return result;\n}\n\nEOS_EResult IEOS::_p2p_close_all_connections(const EOS_P2P_CloseConnectionsOptions *options) {\n    if (s_p2pInterface == nullptr) return EOS_EResult::EOS_InvalidParameters;\n    EOS_EResult result = EOS_P2P_CloseConnections(s_p2pInterface, options);\n    return result;\n}\n\nEOS_EResult IEOS::_p2p_get_next_packet_size(const EOS_P2P_GetNextReceivedPacketSizeOptions *options, uint32_t *out_size) {\n    if (s_p2pInterface == nullptr) return EOS_EResult::EOS_InvalidParameters;\n    EOS_EResult result = EOS_P2P_GetNextReceivedPacketSize(s_p2pInterface, options, out_size);\n    return result;\n}\n\nEOS_EResult IEOS::_p2p_clear_packet_queue(const EOS_P2P_ClearPacketQueueOptions *options) {\n    if (s_p2pInterface == nullptr) return EOS_EResult::EOS_InvalidParameters;\n    EOS_EResult result = EOS_P2P_ClearPacketQueue(s_p2pInterface, options);\n    return result;\n}\n\nEOS_NotificationId IEOS::_p2p_add_notify_peer_connection_established(const EOS_P2P_AddNotifyPeerConnectionEstablishedOptions *options,\n        EOS_P2P_OnPeerConnectionEstablishedCallback callback) {\n    if (s_p2pInterface == nullptr) return EOS_INVALID_NOTIFICATIONID;\n    EOS_NotificationId callback_id = EOS_P2P_AddNotifyPeerConnectionEstablished(s_p2pInterface, options, nullptr, callback);\n    return callback_id;\n}\n\nEOS_NotificationId IEOS::_p2p_add_notify_peer_connection_closed(const EOS_P2P_AddNotifyPeerConnectionClosedOptions *options,\n        EOS_P2P_OnRemoteConnectionClosedCallback callback) {\n    if (s_p2pInterface == nullptr) return EOS_INVALID_NOTIFICATIONID;\n    EOS_NotificationId callback_id = EOS_P2P_AddNotifyPeerConnectionClosed(s_p2pInterface, options, nullptr, callback);\n    return callback_id;\n}\n\nEOS_NotificationId IEOS::_p2p_add_notify_peer_connection_request(const EOS_P2P_AddNotifyPeerConnectionRequestOptions *options,\n        EOS_P2P_OnIncomingConnectionRequestCallback callback) {\n    if (s_p2pInterface == nullptr) return EOS_INVALID_NOTIFICATIONID;\n    EOS_NotificationId callback_id = EOS_P2P_AddNotifyPeerConnectionRequest(s_p2pInterface, options, nullptr, callback);\n    return callback_id;\n}\n\nEOS_NotificationId IEOS::_p2p_add_notify_peer_connection_interrupted(const EOS_P2P_AddNotifyPeerConnectionInterruptedOptions *options,\n        EOS_P2P_OnPeerConnectionInterruptedCallback callback) {\n    if (s_p2pInterface == nullptr) return EOS_INVALID_NOTIFICATIONID;\n    EOS_NotificationId callback_id = EOS_P2P_AddNotifyPeerConnectionInterrupted(s_p2pInterface, options, nullptr, callback);\n    return callback_id;\n}\n\nvoid IEOS::_p2p_remove_notify_peer_connection_established(EOS_NotificationId callback_id) {\n    if (s_p2pInterface == nullptr) return;\n    EOS_P2P_RemoveNotifyPeerConnectionEstablished(s_p2pInterface, callback_id);\n}\n\nvoid IEOS::_p2p_remove_notify_peer_connection_interrupted(EOS_NotificationId callback_id) {\n    if (s_p2pInterface == nullptr) return;\n    EOS_P2P_RemoveNotifyPeerConnectionInterrupted(s_p2pInterface, callback_id);\n}\n\nvoid IEOS::_p2p_remove_notify_peer_connection_closed(EOS_NotificationId callback_id) {\n    if (s_p2pInterface == nullptr) return;\n    EOS_P2P_RemoveNotifyPeerConnectionClosed(s_p2pInterface, callback_id);\n}\n\nvoid IEOS::_p2p_remove_notify_peer_connection_request(EOS_NotificationId callback_id) {\n    if (s_p2pInterface == nullptr) return;\n    EOS_P2P_RemoveNotifyPeerConnectionRequest(s_p2pInterface, callback_id);\n}"
  },
  {
    "path": "src/platform_interface.cpp",
    "content": "#include \"ieos.h\"\nusing namespace godot;\n\nbool IEOS::platform_interface_create(Ref<RefCounted> p_options) {\n    CharString productId = VARIANT_TO_CHARSTRING(p_options->get(\"product_id\"));\n    CharString sandboxId = VARIANT_TO_CHARSTRING(p_options->get(\"sandbox_id\"));\n    CharString deploymentId = VARIANT_TO_CHARSTRING(p_options->get(\"deployment_id\"));\n    CharString encryptionKey = VARIANT_TO_CHARSTRING(p_options->get(\"encryption_key\"));\n    int flags = p_options->get(\"flags\");\n    int tickBudgetInMilliseconds = p_options->get(\"tick_budget_in_milliseconds\");\n    Variant taskNetworkTimeoutSeconds = p_options->get(\"task_network_timeout_seconds\");\n    CharString clientId = VARIANT_TO_CHARSTRING(p_options->get(\"client_id\"));\n    CharString clientSecret = VARIANT_TO_CHARSTRING(p_options->get(\"client_secret\"));\n    CharString overrideCountryCode = VARIANT_TO_CHARSTRING(p_options->get(\"override_country_code\"));\n    CharString overrideLocaleCode = VARIANT_TO_CHARSTRING(p_options->get(\"override_locale_code\"));\n    CharString cache_directory = VARIANT_TO_CHARSTRING(p_options->get(\"cache_directory\"));\n\n    EOS_Platform_Options platformOptions;\n    memset(&platformOptions, 0, sizeof(platformOptions));\n    platformOptions.ApiVersion = EOS_PLATFORM_OPTIONS_API_LATEST;\n    platformOptions.ProductId = productId.get_data();\n    platformOptions.SandboxId = sandboxId.get_data();\n\n    if (clientId.length() != 0) {\n        platformOptions.ClientCredentials.ClientId = clientId.get_data();\n    }\n    if (clientSecret.length() != 0) {\n        platformOptions.ClientCredentials.ClientSecret = clientSecret.get_data();\n    }\n    platformOptions.bIsServer = VARIANT_TO_EOS_BOOL(p_options->get(\"is_server\"));\n    if (encryptionKey.length() != 0) {\n        platformOptions.EncryptionKey = encryptionKey.get_data();\n    }\n    if (overrideCountryCode.length() != 0) {\n        platformOptions.OverrideLocaleCode = overrideCountryCode.get_data();\n    }\n    if (overrideLocaleCode.length() != 0) {\n        platformOptions.OverrideCountryCode = overrideLocaleCode.get_data();\n    }\n    if (cache_directory.length() != 0) {\n        platformOptions.CacheDirectory = cache_directory.get_data();\n    }\n    platformOptions.DeploymentId = deploymentId.get_data();\n    platformOptions.Flags = flags;\n    platformOptions.TickBudgetInMilliseconds = tickBudgetInMilliseconds;\n\n    EOS_Platform_RTCOptions rtcOptions;\n    memset(&rtcOptions, 0, sizeof(rtcOptions));\n    rtcOptions.ApiVersion = EOS_PLATFORM_RTCOPTIONS_API_LATEST;\n#ifdef _WIN32\n    EOS_Windows_RTCOptions windowsRTCOptions;\n    memset(&windowsRTCOptions, 0, sizeof(windowsRTCOptions));\n    windowsRTCOptions.ApiVersion = EOS_WINDOWS_RTCOPTIONS_API_LATEST;\n    CharString xAudio29DllPath;\n    if (OS::get_singleton()->has_feature(\"editor\")) {\n        xAudio29DllPath = ProjectSettings::get_singleton()->globalize_path(\"res://addons/epic-online-services-godot/bin/windows/x64/xaudio2_9redist.dll\").utf8();\n        windowsRTCOptions.XAudio29DllPath = xAudio29DllPath.get_data();\n    } else {\n        xAudio29DllPath = OS::get_singleton()->get_executable_path().get_base_dir().path_join(\"xaudio2_9redist.dll\").utf8();\n        windowsRTCOptions.XAudio29DllPath = xAudio29DllPath.get_data();\n    }\n    rtcOptions.PlatformSpecificOptions = &windowsRTCOptions;\n#else\n    rtcOptions.PlatformSpecificOptions = nullptr;\n#endif\n    // Handle background mode\n    Ref<RefCounted> p_rtc_options = p_options->get(\"rtc_options\");\n    if (p_rtc_options->get(\"background_mode\").get_type() != Variant::NIL) {\n        int backgroundMode = p_rtc_options->get(\"background_mode\");\n        rtcOptions.BackgroundMode = static_cast<EOS_ERTCBackgroundMode>(backgroundMode);\n    }\n\n    platformOptions.RTCOptions = &rtcOptions;\n\n    double p_taskNetworkTimeoutSeconds = taskNetworkTimeoutSeconds;\n    if (taskNetworkTimeoutSeconds.get_type() != Variant::NIL) {\n        platformOptions.TaskNetworkTimeoutSeconds = &p_taskNetworkTimeoutSeconds;\n    }\n\n    if (!platformOptions.IntegratedPlatformOptionsContainerHandle) {\n        EOS_IntegratedPlatform_CreateIntegratedPlatformOptionsContainerOptions createIntegratedPlatformOptionsContainerOptions{};\n        createIntegratedPlatformOptionsContainerOptions.ApiVersion = EOS_INTEGRATEDPLATFORM_CREATEINTEGRATEDPLATFORMOPTIONSCONTAINER_API_LATEST;\n\n        EOS_EResult createIntegratedPlatformOptionsContainerResult = EOS_IntegratedPlatform_CreateIntegratedPlatformOptionsContainer(&createIntegratedPlatformOptionsContainerOptions, &platformOptions.IntegratedPlatformOptionsContainerHandle);\n        if (createIntegratedPlatformOptionsContainerResult != EOS_EResult::EOS_Success) {\n            UtilityFunctions::printerr(\"\\n[EOSG] Failed to create integrated platform options container:\" + String(EOS_EResult_ToString(createIntegratedPlatformOptionsContainerResult)));\n        }\n    }\n\n    s_platformInterface = EOS_Platform_Create(&platformOptions);\n\n    if (platformOptions.IntegratedPlatformOptionsContainerHandle) {\n        EOS_IntegratedPlatformOptionsContainer_Release(platformOptions.IntegratedPlatformOptionsContainerHandle);\n    }\n\n    if (s_platformInterface == nullptr) {\n        isEOSValid = false;\n        return false;\n    } else {\n        isEOSValid = true;\n    }\n\n    // -----\n    // Achievements Interface\n    // -----\n    s_achievementsInterface = EOS_Platform_GetAchievementsInterface(s_platformInterface);\n    if (s_achievementsInterface != nullptr) {\n        EOS_Achievements_AddNotifyAchievementsUnlockedV2Options notifyAchievementsUnlockedV2Options;\n        memset(&notifyAchievementsUnlockedV2Options, 0, sizeof(notifyAchievementsUnlockedV2Options));\n        notifyAchievementsUnlockedV2Options.ApiVersion = EOS_ACHIEVEMENTS_ADDNOTIFYACHIEVEMENTSUNLOCKEDV2_API_LATEST;\n        EOS_Achievements_AddNotifyAchievementsUnlockedV2(s_achievementsInterface, &notifyAchievementsUnlockedV2Options, nullptr, [](const EOS_Achievements_OnAchievementsUnlockedCallbackV2Info *data) {\n            Dictionary ret;\n            ret[\"user_id\"] = eosg_product_user_id_to_string(data->UserId);\n            ret[\"achievement_id\"] = EOSG_GET_STRING(data->AchievementId);\n            ret[\"unlock_time\"] = data->UnlockTime;\n            IEOS::get_singleton()->emit_signal(\"achievements_interface_achievements_unlocked_v2_callback\", ret);\n        });\n    }\n\n    // -----\n    // Auth Interface\n    // -----\n    s_authInterface = EOS_Platform_GetAuthInterface(s_platformInterface);\n    if (s_authInterface != nullptr) {\n        EOS_Auth_AddNotifyLoginStatusChangedOptions notifyAuthLoginStatusChangedOptions;\n        memset(&notifyAuthLoginStatusChangedOptions, 0, sizeof(notifyAuthLoginStatusChangedOptions));\n        notifyAuthLoginStatusChangedOptions.ApiVersion = EOS_AUTH_ADDNOTIFYLOGINSTATUSCHANGED_API_LATEST;\n        EOS_Auth_AddNotifyLoginStatusChanged(s_authInterface, &notifyAuthLoginStatusChangedOptions, nullptr, [](const EOS_Auth_LoginStatusChangedCallbackInfo *data) {\n            Dictionary ret;\n            ret[\"local_user_id\"] = eosg_epic_account_id_to_string(data->LocalUserId);\n            ret[\"prev_status\"] = static_cast<int>(data->PrevStatus);\n            ret[\"current_status\"] = static_cast<int>(data->CurrentStatus);\n            IEOS::get_singleton()->emit_signal(\"auth_interface_login_status_changed\", ret);\n        });\n    }\n\n    // -----\n    // Connect Interface\n    // -----\n    s_connectInterface = EOS_Platform_GetConnectInterface(s_platformInterface);\n    if (s_connectInterface != nullptr) {\n        EOS_Connect_AddNotifyAuthExpirationOptions notifyAuthExpirationOptions;\n        memset(&notifyAuthExpirationOptions, 0, sizeof(notifyAuthExpirationOptions));\n        notifyAuthExpirationOptions.ApiVersion = EOS_CONNECT_ADDNOTIFYAUTHEXPIRATION_API_LATEST;\n        EOS_Connect_AddNotifyAuthExpiration(s_connectInterface, &notifyAuthExpirationOptions, nullptr, [](const EOS_Connect_AuthExpirationCallbackInfo *data) {\n            Dictionary ret;\n            ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n            IEOS::get_singleton()->emit_signal(\"connect_interface_auth_expiration\", ret);\n        });\n        EOS_Connect_AddNotifyLoginStatusChangedOptions notifyConnectLoginStatusChangedOptions;\n        memset(&notifyConnectLoginStatusChangedOptions, 0, sizeof(notifyConnectLoginStatusChangedOptions));\n        notifyConnectLoginStatusChangedOptions.ApiVersion = EOS_CONNECT_ADDNOTIFYLOGINSTATUSCHANGED_API_LATEST;\n        EOS_Connect_AddNotifyLoginStatusChanged(s_connectInterface, &notifyConnectLoginStatusChangedOptions, nullptr, [](const EOS_Connect_LoginStatusChangedCallbackInfo *data) {\n            Dictionary ret;\n            ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n            ret[\"previous_status\"] = static_cast<int>(data->PreviousStatus);\n            ret[\"current_status\"] = static_cast<int>(data->CurrentStatus);\n            IEOS::get_singleton()->emit_signal(\"connect_interface_login_status_changed\", ret);\n        });\n    }\n\n    // -----\n    // Custom Invites Interface\n    // -----\n    s_customInvitesInterface = EOS_Platform_GetCustomInvitesInterface(s_platformInterface);\n    if (s_customInvitesInterface != nullptr) {\n        EOS_CustomInvites_AddNotifyCustomInviteReceivedOptions notifyCustomInviteReceivedOptions;\n        notifyCustomInviteReceivedOptions.ApiVersion = EOS_CUSTOMINVITES_ADDNOTIFYCUSTOMINVITERECEIVED_API_LATEST;\n        EOS_CustomInvites_AddNotifyCustomInviteReceived(s_customInvitesInterface, &notifyCustomInviteReceivedOptions, nullptr, [](const EOS_CustomInvites_OnCustomInviteReceivedCallbackInfo *data) {\n            Dictionary ret;\n            ret[\"target_user_id\"] = eosg_product_user_id_to_string(data->TargetUserId);\n            ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n            ret[\"custom_invite_id\"] = EOSG_GET_STRING(data->CustomInviteId);\n            ret[\"payload\"] = EOSG_GET_STRING(data->Payload);\n            IEOS::get_singleton()->emit_signal(\"custom_invites_interface_custom_invite_received_callback\", ret);\n        });\n        EOS_CustomInvites_AddNotifyCustomInviteAcceptedOptions notifyCustomInviteAcceptedOptions;\n        notifyCustomInviteAcceptedOptions.ApiVersion = EOS_CUSTOMINVITES_ADDNOTIFYCUSTOMINVITEACCEPTED_API_LATEST;\n        EOS_CustomInvites_AddNotifyCustomInviteAccepted(s_customInvitesInterface, &notifyCustomInviteAcceptedOptions, nullptr, [](const EOS_CustomInvites_OnCustomInviteAcceptedCallbackInfo *data) {\n            Dictionary ret;\n            ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n            ret[\"target_user_id\"] = eosg_product_user_id_to_string(data->TargetUserId);\n            ret[\"custom_invite_id\"] = EOSG_GET_STRING(data->CustomInviteId);\n            ret[\"payload\"] = EOSG_GET_STRING(data->Payload);\n            IEOS::get_singleton()->emit_signal(\"custom_invites_interface_custom_invite_accepted_callback\", ret);\n        });\n        EOS_CustomInvites_AddNotifyCustomInviteRejectedOptions notifyCustomInviteRejectedOptions;\n        notifyCustomInviteRejectedOptions.ApiVersion = EOS_CUSTOMINVITES_ADDNOTIFYCUSTOMINVITEREJECTED_API_LATEST;\n        EOS_CustomInvites_AddNotifyCustomInviteRejected(s_customInvitesInterface, &notifyCustomInviteRejectedOptions, nullptr, [](const EOS_CustomInvites_CustomInviteRejectedCallbackInfo *data) {\n            Dictionary ret;\n            ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n            ret[\"target_user_id\"] = eosg_product_user_id_to_string(data->TargetUserId);\n            ret[\"custom_invite_id\"] = EOSG_GET_STRING(data->CustomInviteId);\n            ret[\"payload\"] = EOSG_GET_STRING(data->Payload);\n            IEOS::get_singleton()->emit_signal(\"custom_invites_interface_custom_invite_rejected_callback\", ret);\n        });\n        EOS_CustomInvites_AddNotifyRequestToJoinResponseReceivedOptions notifyCustomRequestToJoinResponseReceivedOptions;\n        notifyCustomRequestToJoinResponseReceivedOptions.ApiVersion = EOS_CUSTOMINVITES_ADDNOTIFYREQUESTTOJOINRESPONSERECEIVED_API_LATEST;\n        EOS_CustomInvites_AddNotifyRequestToJoinResponseReceived(s_customInvitesInterface, &notifyCustomRequestToJoinResponseReceivedOptions, nullptr, [](const EOS_CustomInvites_RequestToJoinResponseReceivedCallbackInfo *data) {\n            Dictionary ret;\n            ret[\"from_user_id\"] = eosg_product_user_id_to_string(data->FromUserId);\n            ret[\"to_user_id\"] = eosg_product_user_id_to_string(data->ToUserId);\n            ret[\"response\"] = static_cast<int>(data->Response);\n            IEOS::get_singleton()->emit_signal(\"custom_invites_interface_request_to_join_response_received_callback\", ret);\n        });\n        EOS_CustomInvites_AddNotifyRequestToJoinReceivedOptions notifyCustomRequestToJoinReceivedOptions;\n        notifyCustomRequestToJoinReceivedOptions.ApiVersion = EOS_CUSTOMINVITES_ADDNOTIFYREQUESTTOJOINRECEIVED_API_LATEST;\n        EOS_CustomInvites_AddNotifyRequestToJoinReceived(s_customInvitesInterface, &notifyCustomRequestToJoinReceivedOptions, nullptr, [](const EOS_CustomInvites_RequestToJoinReceivedCallbackInfo *data) {\n            Dictionary ret;\n            ret[\"from_user_id\"] = eosg_product_user_id_to_string(data->FromUserId);\n            ret[\"to_user_id\"] = eosg_product_user_id_to_string(data->ToUserId);\n            IEOS::get_singleton()->emit_signal(\"custom_invites_interface_request_to_join_received_callback\", ret);\n        });\n        EOS_CustomInvites_AddNotifyRequestToJoinAcceptedOptions notifyCustomRequestToJoinAcceptedOptions;\n        notifyCustomRequestToJoinAcceptedOptions.ApiVersion = EOS_CUSTOMINVITES_ADDNOTIFYREQUESTTOJOINACCEPTED_API_LATEST;\n        EOS_CustomInvites_AddNotifyRequestToJoinAccepted(s_customInvitesInterface, &notifyCustomRequestToJoinAcceptedOptions, nullptr, [](const EOS_CustomInvites_OnRequestToJoinAcceptedCallbackInfo *data) {\n            Dictionary ret;\n            ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n            ret[\"target_user_id\"] = eosg_product_user_id_to_string(data->TargetUserId);\n            IEOS::get_singleton()->emit_signal(\"custom_invites_interface_request_to_join_accepted_callback\", ret);\n        });\n        EOS_CustomInvites_AddNotifyRequestToJoinRejectedOptions notifyCustomRequestToJoinRejectedOptions;\n        notifyCustomRequestToJoinRejectedOptions.ApiVersion = EOS_CUSTOMINVITES_ADDNOTIFYREQUESTTOJOINREJECTED_API_LATEST;\n        EOS_CustomInvites_AddNotifyRequestToJoinRejected(s_customInvitesInterface, &notifyCustomRequestToJoinRejectedOptions, nullptr, [](const EOS_CustomInvites_OnRequestToJoinRejectedCallbackInfo *data) {\n            Dictionary ret;\n            ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n            ret[\"target_user_id\"] = eosg_product_user_id_to_string(data->TargetUserId);\n            IEOS::get_singleton()->emit_signal(\"custom_invites_interface_request_to_join_rejected_callback\", ret);\n        });\n    }\n\n    // -----\n    // ECOM Interface\n    // -----\n    s_ecomInterface = EOS_Platform_GetEcomInterface(s_platformInterface);\n\n    // -----\n    // Friends Interface\n    // -----\n    s_friendsInterface = EOS_Platform_GetFriendsInterface(s_platformInterface);\n    if (s_friendsInterface != nullptr) {\n        EOS_Friends_AddNotifyFriendsUpdateOptions notifyFriendsUpdateOptions;\n        notifyFriendsUpdateOptions.ApiVersion = EOS_FRIENDS_ADDNOTIFYFRIENDSUPDATE_API_LATEST;\n        EOS_Friends_AddNotifyFriendsUpdate(s_friendsInterface, &notifyFriendsUpdateOptions, nullptr, [](const EOS_Friends_OnFriendsUpdateInfo *data) {\n            Dictionary ret;\n            ret[\"local_user_id\"] = eosg_epic_account_id_to_string(data->LocalUserId);\n            ret[\"target_user_id\"] = eosg_epic_account_id_to_string(data->TargetUserId);\n            ret[\"previous_status\"] = static_cast<int>(data->PreviousStatus);\n            ret[\"current_status\"] = static_cast<int>(data->CurrentStatus);\n            IEOS::get_singleton()->emit_signal(\"friends_interface_friends_update_callback\", ret);\n        });\n        EOS_Friends_AddNotifyBlockedUsersUpdateOptions notifyBlockedUsersUpdateOptions;\n        notifyBlockedUsersUpdateOptions.ApiVersion = EOS_FRIENDS_ADDNOTIFYBLOCKEDUSERSUPDATE_API_LATEST;\n        EOS_Friends_AddNotifyBlockedUsersUpdate(s_friendsInterface, &notifyBlockedUsersUpdateOptions, nullptr, [](const EOS_Friends_OnBlockedUsersUpdateInfo *data) {\n            Dictionary ret;\n            ret[\"local_user_id\"] = eosg_epic_account_id_to_string(data->LocalUserId);\n            ret[\"target_user_id\"] = eosg_epic_account_id_to_string(data->TargetUserId);\n            ret[\"blocked\"] = EOSG_GET_BOOL(data->bBlocked);\n            IEOS::get_singleton()->emit_signal(\"friends_interface_blocked_users_update_callback\", ret);\n        });\n    }\n\n    // -----\n    // KWS Interface\n    // -----\n    s_kwsInterface = EOS_Platform_GetKWSInterface(s_platformInterface);\n    if (s_kwsInterface != nullptr) {\n        EOS_KWS_AddNotifyPermissionsUpdateReceivedOptions notifyPermissionsUpdateReceivedOptions;\n        notifyPermissionsUpdateReceivedOptions.ApiVersion = EOS_KWS_ADDNOTIFYPERMISSIONSUPDATERECEIVED_API_LATEST;\n        EOS_KWS_AddNotifyPermissionsUpdateReceived(s_kwsInterface, &notifyPermissionsUpdateReceivedOptions, nullptr, [](const EOS_KWS_PermissionsUpdateReceivedCallbackInfo *data) {\n            Dictionary ret;\n            ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n            ret[\"kws_user_id\"] = EOSG_GET_STRING(data->KWSUserId);\n            ret[\"date_of_birth\"] = EOSG_GET_STRING(data->DateOfBirth);\n            ret[\"is_minor\"] = EOSG_GET_BOOL(data->bIsMinor);\n            ret[\"parent_email\"] = EOSG_GET_STRING(data->ParentEmail);\n            IEOS::get_singleton()->emit_signal(\"kws_interface_permissions_update_received_callback\", ret);\n        });\n    }\n\n    // -----\n    // Leaderboards Interface\n    // -----\n    s_leaderboardsInterface = EOS_Platform_GetLeaderboardsInterface(s_platformInterface);\n\n    // -----\n    // Lobby Interface\n    // -----\n    s_lobbyInterface = EOS_Platform_GetLobbyInterface(s_platformInterface);\n    if (s_lobbyInterface != nullptr) {\n        EOS_Lobby_AddNotifyLobbyUpdateReceivedOptions notifyLobbyUpdateReceivedOptions;\n        notifyLobbyUpdateReceivedOptions.ApiVersion = EOS_LOBBY_ADDNOTIFYLOBBYUPDATERECEIVED_API_LATEST;\n        EOS_Lobby_AddNotifyLobbyUpdateReceived(s_lobbyInterface, &notifyLobbyUpdateReceivedOptions, nullptr, [](const EOS_Lobby_LobbyUpdateReceivedCallbackInfo *data) {\n            Dictionary ret;\n            ret[\"lobby_id\"] = EOSG_GET_STRING(data->LobbyId);\n            IEOS::get_singleton()->emit_signal(\"lobby_interface_lobby_update_received_callback\", ret);\n        });\n        EOS_Lobby_AddNotifyLobbyMemberUpdateReceivedOptions notifyLobbyMemberUpdateReceivedOptions;\n        notifyLobbyMemberUpdateReceivedOptions.ApiVersion = EOS_LOBBY_ADDNOTIFYLOBBYMEMBERUPDATERECEIVED_API_LATEST;\n        EOS_Lobby_AddNotifyLobbyMemberUpdateReceived(s_lobbyInterface, &notifyLobbyMemberUpdateReceivedOptions, nullptr, [](const EOS_Lobby_LobbyMemberUpdateReceivedCallbackInfo *data) {\n            Dictionary ret;\n            ret[\"lobby_id\"] = EOSG_GET_STRING(data->LobbyId);\n            ret[\"target_user_id\"] = eosg_product_user_id_to_string(data->TargetUserId);\n            IEOS::get_singleton()->emit_signal(\"lobby_interface_lobby_member_update_received_callback\", ret);\n        });\n        EOS_Lobby_AddNotifyLobbyMemberStatusReceivedOptions notifyLobbyMemberStatusReceivedOptions;\n        notifyLobbyMemberStatusReceivedOptions.ApiVersion = EOS_LOBBY_ADDNOTIFYLOBBYMEMBERSTATUSRECEIVED_API_LATEST;\n        EOS_Lobby_AddNotifyLobbyMemberStatusReceived(s_lobbyInterface, &notifyLobbyMemberStatusReceivedOptions, nullptr, [](const EOS_Lobby_LobbyMemberStatusReceivedCallbackInfo *data) {\n            Dictionary ret;\n            ret[\"lobby_id\"] = EOSG_GET_STRING(data->LobbyId);\n            ret[\"target_user_id\"] = eosg_product_user_id_to_string(data->TargetUserId);\n            ret[\"current_status\"] = static_cast<int>(data->CurrentStatus);\n            IEOS::get_singleton()->emit_signal(\"lobby_interface_lobby_member_status_received_callback\", ret);\n        });\n        EOS_Lobby_AddNotifyLobbyInviteReceivedOptions notifyLobbyInviteReceivedOptions;\n        notifyLobbyInviteReceivedOptions.ApiVersion = EOS_LOBBY_ADDNOTIFYLOBBYINVITERECEIVED_API_LATEST;\n        EOS_Lobby_AddNotifyLobbyInviteReceived(s_lobbyInterface, &notifyLobbyInviteReceivedOptions, nullptr, [](const EOS_Lobby_LobbyInviteReceivedCallbackInfo *data) {\n            Dictionary ret;\n            ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n            ret[\"target_user_id\"] = eosg_product_user_id_to_string(data->TargetUserId);\n            ret[\"invite_id\"] = EOSG_GET_STRING(data->InviteId);\n            IEOS::get_singleton()->emit_signal(\"lobby_interface_lobby_invite_received_callback\", ret);\n        });\n        EOS_Lobby_AddNotifyLobbyInviteAcceptedOptions notifyLobbyInviteAcceptedOptions;\n        notifyLobbyInviteAcceptedOptions.ApiVersion = EOS_LOBBY_ADDNOTIFYLOBBYINVITEACCEPTED_API_LATEST;\n        EOS_Lobby_AddNotifyLobbyInviteAccepted(s_lobbyInterface, &notifyLobbyInviteAcceptedOptions, nullptr, [](const EOS_Lobby_LobbyInviteAcceptedCallbackInfo *data) {\n            Dictionary ret;\n            ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n            ret[\"target_user_id\"] = eosg_product_user_id_to_string(data->TargetUserId);\n            ret[\"invite_id\"] = EOSG_GET_STRING(data->InviteId);\n            ret[\"lobby_id\"] = EOSG_GET_STRING(data->LobbyId);\n            IEOS::get_singleton()->emit_signal(\"lobby_interface_lobby_invite_accepted_callback\", ret);\n        });\n        EOS_Lobby_AddNotifyLobbyInviteRejectedOptions notifyLobbyInviteRejectedOptions;\n        notifyLobbyInviteRejectedOptions.ApiVersion = EOS_LOBBY_ADDNOTIFYLOBBYINVITEREJECTED_API_LATEST;\n        EOS_Lobby_AddNotifyLobbyInviteRejected(s_lobbyInterface, &notifyLobbyInviteRejectedOptions, nullptr, [](const EOS_Lobby_LobbyInviteRejectedCallbackInfo *data) {\n            Dictionary ret;\n            ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n            ret[\"target_user_id\"] = eosg_product_user_id_to_string(data->TargetUserId);\n            ret[\"invite_id\"] = EOSG_GET_STRING(data->InviteId);\n            ret[\"lobby_id\"] = EOSG_GET_STRING(data->LobbyId);\n            IEOS::get_singleton()->emit_signal(\"lobby_interface_lobby_invite_rejected_callback\", ret);\n        });\n        EOS_Lobby_AddNotifyJoinLobbyAcceptedOptions notifyJoinLobbyAcceptedOptions;\n        notifyJoinLobbyAcceptedOptions.ApiVersion = EOS_LOBBY_ADDNOTIFYJOINLOBBYACCEPTED_API_LATEST;\n        EOS_Lobby_AddNotifyJoinLobbyAccepted(s_lobbyInterface, &notifyJoinLobbyAcceptedOptions, nullptr, [](const EOS_Lobby_JoinLobbyAcceptedCallbackInfo *data) {\n            Dictionary ret;\n            ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n            ret[\"ui_event_id\"] = data->UiEventId;\n            IEOS::get_singleton()->emit_signal(\"lobby_interface_join_lobby_accepted_callback\", ret);\n        });\n        EOS_Lobby_AddNotifySendLobbyNativeInviteRequestedOptions notifySendLobbyNativeInviteRequestedOptions;\n        notifySendLobbyNativeInviteRequestedOptions.ApiVersion = EOS_LOBBY_ADDNOTIFYSENDLOBBYNATIVEINVITEREQUESTED_API_LATEST;\n        EOS_Lobby_AddNotifySendLobbyNativeInviteRequested(s_lobbyInterface, &notifySendLobbyNativeInviteRequestedOptions, nullptr, [](const EOS_Lobby_SendLobbyNativeInviteRequestedCallbackInfo *data) {\n            Dictionary ret;\n            ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n            ret[\"ui_event_id\"] = data->UiEventId;\n            ret[\"target_native_account_type\"] = EOSG_GET_STRING(data->TargetNativeAccountType);\n            ret[\"target_native_account_id\"] = EOSG_GET_STRING(data->TargetUserNativeAccountId);\n            ret[\"lobby_id\"] = EOSG_GET_STRING(data->LobbyId);\n            IEOS::get_singleton()->emit_signal(\"lobby_interface_send_lobby_native_invite_requested_callback\", ret);\n        });\n        EOS_Lobby_AddNotifyRTCRoomConnectionChangedOptions notifyRTCRoomConnectionChangedOptions;\n        notifyRTCRoomConnectionChangedOptions.ApiVersion = EOS_LOBBY_ADDNOTIFYRTCROOMCONNECTIONCHANGED_API_LATEST;\n        EOS_Lobby_AddNotifyRTCRoomConnectionChanged(s_lobbyInterface, &notifyRTCRoomConnectionChangedOptions, nullptr, [](const EOS_Lobby_RTCRoomConnectionChangedCallbackInfo *data) {\n            Dictionary ret;\n            ret[\"lobby_id\"] = EOSG_GET_STRING(data->LobbyId);\n            ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n            ret[\"is_connected\"] = EOSG_GET_BOOL(data->bIsConnected);\n            ret[\"disconnect_reason\"] = static_cast<int>(data->DisconnectReason);\n            IEOS::get_singleton()->emit_signal(\"lobby_interface_rtc_room_connection_changed_callback\", ret);\n        });\n        EOS_Lobby_AddNotifyLeaveLobbyRequestedOptions notifyLeaveLobbyRequestedOptions;\n        notifyLeaveLobbyRequestedOptions.ApiVersion = EOS_LOBBY_ADDNOTIFYLEAVELOBBYREQUESTED_API_LATEST;\n        EOS_Lobby_AddNotifyLeaveLobbyRequested(s_lobbyInterface, &notifyLeaveLobbyRequestedOptions, nullptr, [](const EOS_Lobby_LeaveLobbyRequestedCallbackInfo *data) {\n            Dictionary ret;\n            ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n            ret[\"lobby_id\"] = EOSG_GET_STRING(data->LobbyId);\n            IEOS::get_singleton()->emit_signal(\"lobby_interface_leave_lobby_requested_callback\", ret);\n        });\n    }\n\n    // -----\n    // Metrics Interface\n    // -----\n    s_metricsInterface = EOS_Platform_GetMetricsInterface(s_platformInterface);\n\n    // -----\n    // Mods Interface\n    // -----\n    s_modsInterface = EOS_Platform_GetModsInterface(s_platformInterface);\n\n    // -----\n    // P2P Interface\n    // -----\n    s_p2pInterface = EOS_Platform_GetP2PInterface(s_platformInterface);\n    if (s_p2pInterface != nullptr) {\n        EOS_P2P_AddNotifyIncomingPacketQueueFullOptions notifyIncomingPacketQueueFullOptions;\n        notifyIncomingPacketQueueFullOptions.ApiVersion = EOS_P2P_ADDNOTIFYINCOMINGPACKETQUEUEFULL_API_LATEST;\n        EOS_P2P_AddNotifyIncomingPacketQueueFull(s_p2pInterface, &notifyIncomingPacketQueueFullOptions, nullptr, [](const EOS_P2P_OnIncomingPacketQueueFullInfo *data) {\n            Dictionary ret;\n            ret[\"overflow_packet_channel\"] = data->OverflowPacketChannel;\n            ret[\"overflow_packet_local_user_id\"] = eosg_product_user_id_to_string(data->OverflowPacketLocalUserId);\n            ret[\"overflow_packet_size_bytes\"] = data->OverflowPacketSizeBytes;\n            ret[\"packet_queue_current_size_bytes\"] = data->PacketQueueCurrentSizeBytes;\n            ret[\"packet_queue_max_size_bytes\"] = data->PacketQueueMaxSizeBytes;\n            IEOS::get_singleton()->emit_signal(\"p2p_interface_incoming_packet_queue_full\", ret);\n        });\n    }\n\n    // -----\n    // PlayerDataStorage Interface\n    // -----\n    s_playerDataStorageInterface = EOS_Platform_GetPlayerDataStorageInterface(s_platformInterface);\n\n    // -----\n    // Presence Interface\n    // -----\n    s_presenceInterface = EOS_Platform_GetPresenceInterface(s_platformInterface);\n    if (s_presenceInterface != nullptr) {\n        EOS_Presence_AddNotifyOnPresenceChangedOptions notifyOnPresenceChangedOptions;\n        notifyOnPresenceChangedOptions.ApiVersion = EOS_PRESENCE_ADDNOTIFYONPRESENCECHANGED_API_LATEST;\n        EOS_Presence_AddNotifyOnPresenceChanged(s_presenceInterface, &notifyOnPresenceChangedOptions, nullptr, [](const EOS_Presence_PresenceChangedCallbackInfo *data) {\n            Dictionary ret;\n            ret[\"local_user_id\"] = eosg_epic_account_id_to_string(data->LocalUserId);\n            ret[\"presence_user_id\"] = eosg_epic_account_id_to_string(data->PresenceUserId);\n            IEOS::get_singleton()->emit_signal(\"presence_interface_presence_changed_callback\", ret);\n        });\n        EOS_Presence_AddNotifyJoinGameAcceptedOptions notifyJoinGameAcceptedOptions;\n        notifyJoinGameAcceptedOptions.ApiVersion = EOS_PRESENCE_ADDNOTIFYJOINGAMEACCEPTED_API_LATEST;\n        EOS_Presence_AddNotifyJoinGameAccepted(s_presenceInterface, &notifyJoinGameAcceptedOptions, nullptr, [](const EOS_Presence_JoinGameAcceptedCallbackInfo *data) {\n            Dictionary ret;\n            ret[\"local_user_id\"] = eosg_epic_account_id_to_string(data->LocalUserId);\n            ret[\"target_user_id\"] = eosg_epic_account_id_to_string(data->TargetUserId);\n            ret[\"ui_event_id\"] = data->UiEventId;\n            ret[\"join_info\"] = EOSG_GET_STRING(data->JoinInfo);\n            IEOS::get_singleton()->emit_signal(\"presence_interface_join_game_accepted_callback\", ret);\n        });\n    }\n\n    // -----\n    // ProgressionSnapshot Interface\n    // -----\n    s_progressionSnapshotInterface = EOS_Platform_GetProgressionSnapshotInterface(s_platformInterface);\n\n    // -----\n    // Reports Interface\n    // -----\n    s_reportsInterface = EOS_Platform_GetReportsInterface(s_platformInterface);\n\n    // -----\n    // Sanctions Interface\n    // -----\n    s_sanctionsInterface = EOS_Platform_GetSanctionsInterface(s_platformInterface);\n\n    // -----\n    // Sessions Interface\n    // -----\n    s_sessionsInterface = EOS_Platform_GetSessionsInterface(s_platformInterface);\n    if (s_sessionsInterface != nullptr) {\n        EOS_Sessions_AddNotifySessionInviteReceivedOptions notifySessionInviteReceivedOptions;\n        notifySessionInviteReceivedOptions.ApiVersion = EOS_SESSIONS_ADDNOTIFYSESSIONINVITERECEIVED_API_LATEST;\n        EOS_Sessions_AddNotifySessionInviteReceived(s_sessionsInterface, &notifySessionInviteReceivedOptions, nullptr, [](const EOS_Sessions_SessionInviteReceivedCallbackInfo *data) {\n            Dictionary ret;\n            ret[\"invite_id\"] = EOSG_GET_STRING(data->InviteId);\n            ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n            ret[\"target_user_id\"] = eosg_product_user_id_to_string(data->TargetUserId);\n            IEOS::get_singleton()->emit_signal(\"sessions_interface_session_invite_received_callback\", ret);\n        });\n        EOS_Sessions_AddNotifySessionInviteAcceptedOptions notifySessionInviteAcceptedOptions;\n        notifySessionInviteAcceptedOptions.ApiVersion = EOS_SESSIONS_ADDNOTIFYSESSIONINVITEACCEPTED_API_LATEST;\n        EOS_Sessions_AddNotifySessionInviteAccepted(s_sessionsInterface, &notifySessionInviteAcceptedOptions, nullptr, [](const EOS_Sessions_SessionInviteAcceptedCallbackInfo *data) {\n            Dictionary ret;\n            ret[\"invite_id\"] = EOSG_GET_STRING(data->InviteId);\n            ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n            ret[\"session_id\"] = EOSG_GET_STRING(data->SessionId);\n            ret[\"target_user_id\"] = eosg_product_user_id_to_string(data->TargetUserId);\n            IEOS::get_singleton()->emit_signal(\"sessions_interface_session_invite_accepted_callback\", ret);\n        });\n        EOS_Sessions_AddNotifySessionInviteRejectedOptions notifySessionInviteRejectedOptions;\n        notifySessionInviteRejectedOptions.ApiVersion = EOS_SESSIONS_ADDNOTIFYSESSIONINVITEREJECTED_API_LATEST;\n        EOS_Sessions_AddNotifySessionInviteRejected(s_sessionsInterface, &notifySessionInviteRejectedOptions, nullptr, [](const EOS_Sessions_SessionInviteRejectedCallbackInfo *data) {\n            Dictionary ret;\n            ret[\"invite_id\"] = EOSG_GET_STRING(data->InviteId);\n            ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n            ret[\"session_id\"] = EOSG_GET_STRING(data->SessionId);\n            ret[\"target_user_id\"] = eosg_product_user_id_to_string(data->TargetUserId);\n            IEOS::get_singleton()->emit_signal(\"sessions_interface_session_invite_rejected_callback\", ret);\n        });\n        EOS_Sessions_AddNotifyJoinSessionAcceptedOptions notifyJoinSessionAcceptedOptions;\n        notifyJoinSessionAcceptedOptions.ApiVersion = EOS_SESSIONS_ADDNOTIFYJOINSESSIONACCEPTED_API_LATEST;\n        EOS_Sessions_AddNotifyJoinSessionAccepted(s_sessionsInterface, &notifyJoinSessionAcceptedOptions, nullptr, [](const EOS_Sessions_JoinSessionAcceptedCallbackInfo *data) {\n            Dictionary ret;\n            ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n            ret[\"ui_event_id\"] = data->UiEventId;\n            IEOS::get_singleton()->emit_signal(\"sessions_interface_join_session_accepted_callback\", ret);\n        });\n        EOS_Sessions_AddNotifyLeaveSessionRequestedOptions notifyLeaveSessionRequestedOptions;\n        notifyLeaveSessionRequestedOptions.ApiVersion = EOS_SESSIONS_ADDNOTIFYLEAVESESSIONREQUESTED_API_LATEST;\n        EOS_Sessions_AddNotifyLeaveSessionRequested(s_sessionsInterface, &notifyLeaveSessionRequestedOptions, nullptr, [](const EOS_Sessions_LeaveSessionRequestedCallbackInfo *data) {\n            Dictionary ret;\n            ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n            ret[\"session_name\"] = EOSG_GET_STRING(data->SessionName);\n            IEOS::get_singleton()->emit_signal(\"sessions_interface_leave_session_requested_callback\", ret);\n        });\n        EOS_Sessions_AddNotifySendSessionNativeInviteRequestedOptions notifySendSessionNativeInviteRequestedOptions;\n        notifySendSessionNativeInviteRequestedOptions.ApiVersion = EOS_SESSIONS_ADDNOTIFYSENDSESSIONNATIVEINVITEREQUESTED_API_LATEST;\n        EOS_Sessions_AddNotifySendSessionNativeInviteRequested(s_sessionsInterface, &notifySendSessionNativeInviteRequestedOptions, nullptr, [](const EOS_Sessions_SendSessionNativeInviteRequestedCallbackInfo *data) {\n            Dictionary ret;\n            ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n            ret[\"session_id\"] = EOSG_GET_STRING(data->SessionId);\n            ret[\"target_native_account_type\"] = EOSG_GET_STRING(data->TargetNativeAccountType);\n            ret[\"target_user_native_account_id\"] = EOSG_GET_STRING(data->TargetUserNativeAccountId);\n            ret[\"ui_event_id\"] = data->UiEventId;\n            IEOS::get_singleton()->emit_signal(\"sessions_interface_send_session_native_invite_requested_callback\", ret);\n        });\n    }\n\n    // -----\n    // Stats Interface\n    // -----\n    s_statsInterface = EOS_Platform_GetStatsInterface(s_platformInterface);\n\n    // -----\n    // RTC Interface\n    // -----\n    s_rtcInterface = EOS_Platform_GetRTCInterface(s_platformInterface);\n\n    // -----\n    // RTCAudio Interface\n    // -----\n    s_rtcAudioInterface = EOS_RTC_GetAudioInterface(s_rtcInterface);\n    if (s_rtcAudioInterface != nullptr) {\n        EOS_RTCAudio_AddNotifyAudioDevicesChangedOptions notifyAudioDevicesChangedOptions;\n        memset(&notifyAudioDevicesChangedOptions, 0, sizeof(notifyAudioDevicesChangedOptions));\n        notifyAudioDevicesChangedOptions.ApiVersion = EOS_RTCAUDIO_ADDNOTIFYAUDIODEVICESCHANGED_API_LATEST;\n        EOS_RTCAudio_AddNotifyAudioDevicesChanged(s_rtcAudioInterface, &notifyAudioDevicesChangedOptions, nullptr, [](const EOS_RTCAudio_AudioDevicesChangedCallbackInfo *data) {\n            Dictionary ret;\n            IEOS::get_singleton()->emit_signal(\"rtc_audio_audio_devices_changed\", ret);\n        });\n    }\n\n\t// -----\n    // RTCData Interface\n    // -----\n    s_rtcDataInterface = EOS_RTC_GetDataInterface(s_rtcInterface);\n\n    // -----\n    // TitleStorage Interface\n    // -----\n    s_titleStorageInterface = EOS_Platform_GetTitleStorageInterface(s_platformInterface);\n\n    // -----\n    // UI Interface\n    // -----\n    s_uiInterface = EOS_Platform_GetUIInterface(s_platformInterface);\n    if (s_uiInterface != nullptr) {\n        EOS_UI_AddNotifyDisplaySettingsUpdatedOptions notifyDisplaySettingsUpdatedOptions;\n        notifyDisplaySettingsUpdatedOptions.ApiVersion = EOS_UI_ADDNOTIFYDISPLAYSETTINGSUPDATED_API_LATEST;\n        EOS_UI_AddNotifyDisplaySettingsUpdated(s_uiInterface, &notifyDisplaySettingsUpdatedOptions, nullptr, [](const EOS_UI_OnDisplaySettingsUpdatedCallbackInfo *data) {\n            Dictionary ret;\n            ret[\"is_visible\"] = EOSG_GET_BOOL(data->bIsVisible);\n            ret[\"is_exclusive_input\"] = EOSG_GET_BOOL(data->bIsExclusiveInput);\n            IEOS::get_singleton()->emit_signal(\"ui_interface_display_settings_updated_callback\", ret);\n        });\n        EOS_UI_AddNotifyMemoryMonitorOptions notifyMemoryMonitorOptions;\n        notifyMemoryMonitorOptions.ApiVersion = EOS_UI_ADDNOTIFYMEMORYMONITOR_API_LATEST;\n        EOS_UI_AddNotifyMemoryMonitor(s_uiInterface, &notifyMemoryMonitorOptions, nullptr, [](const EOS_UI_MemoryMonitorCallbackInfo *data) {\n            Dictionary ret;\n            IEOS::get_singleton()->emit_signal(\"ui_interface_memory_monitor_callback\", ret);\n        });\n    }\n\n    // -----\n    // UserInfo Interface\n    // -----\n    s_userInfoInterface = EOS_Platform_GetUserInfoInterface(s_platformInterface);\n\n    // -----\n    // AntiCheatServer Interface\n    // -----\n    s_antiCheatServerInterface = EOS_Platform_GetAntiCheatServerInterface(s_platformInterface);\n    if (s_antiCheatServerInterface != nullptr) {\n        EOS_AntiCheatServer_AddNotifyMessageToClientOptions notifyMessageToClientOptions;\n        notifyMessageToClientOptions.ApiVersion = EOS_ANTICHEATSERVER_ADDNOTIFYMESSAGETOCLIENT_API_LATEST;\n        EOS_AntiCheatServer_AddNotifyMessageToClient(s_antiCheatServerInterface, &notifyMessageToClientOptions, nullptr, [](const EOS_AntiCheatCommon_OnMessageToClientCallbackInfo *data) {\n            PackedByteArray buffer;\n            buffer.resize(data->MessageDataSizeBytes);\n            std::memcpy(buffer.ptrw(), data->MessageData, data->MessageDataSizeBytes);\n\n            String client_handle = IEOS::get_singleton()->_anticheat_player_handle_to_id(data->ClientHandle);\n\n            Dictionary ret;\n            ret[\"client_handle\"] = client_handle;\n            ret[\"message_data\"] = buffer;\n            IEOS::get_singleton()->emit_signal(\"anticheatserver_interface_message_to_client_callback\", ret);\n        });\n\n        EOS_AntiCheatServer_AddNotifyClientActionRequiredOptions notifyClientActionRequiredOptions;\n        notifyClientActionRequiredOptions.ApiVersion = EOS_ANTICHEATSERVER_ADDNOTIFYCLIENTACTIONREQUIRED_API_LATEST;\n        EOS_AntiCheatServer_AddNotifyClientActionRequired(s_antiCheatServerInterface, &notifyClientActionRequiredOptions, nullptr, [](const EOS_AntiCheatCommon_OnClientActionRequiredCallbackInfo *data) {\n            Dictionary ret;\n            String client_handle = IEOS::get_singleton()->_anticheat_player_handle_to_id(data->ClientHandle);\n            ret[\"client_handle\"] = client_handle;\n            ret[\"client_action\"] = static_cast<int>(data->ClientAction);\n            ret[\"action_reason_code\"] = static_cast<int>(data->ActionReasonCode);\n            ret[\"action_reason_details_string\"] = EOSG_GET_STRING(data->ActionReasonDetailsString);\n            IEOS::get_singleton()->emit_signal(\"anticheatserver_interface_client_action_required_callback\", ret);\n        });\n\n        EOS_AntiCheatServer_AddNotifyClientAuthStatusChangedOptions notifyClientAuthStatusChangedOptions;\n        notifyClientAuthStatusChangedOptions.ApiVersion = EOS_ANTICHEATSERVER_ADDNOTIFYCLIENTAUTHSTATUSCHANGED_API_LATEST;\n        EOS_AntiCheatServer_AddNotifyClientAuthStatusChanged(s_antiCheatServerInterface, &notifyClientAuthStatusChangedOptions, nullptr, [](const EOS_AntiCheatCommon_OnClientAuthStatusChangedCallbackInfo *data) {\n            Dictionary ret;\n            String client_handle = IEOS::get_singleton()->_anticheat_player_handle_to_id(data->ClientHandle);\n            ret[\"client_handle\"] = client_handle;\n            ret[\"client_auth_status\"] = static_cast<int>(data->ClientAuthStatus);\n            IEOS::get_singleton()->emit_signal(\"anticheatserver_interface_client_auth_status_changed_callback\", ret);\n        });\n    }\n\n    // -----\n    // AntiCheatClient Interface\n    // -----\n    s_antiCheatClientInterface = EOS_Platform_GetAntiCheatClientInterface(s_platformInterface);\n    if (s_antiCheatClientInterface != nullptr) {\n        EOS_AntiCheatClient_AddNotifyMessageToServerOptions notifyMessageToServerOptions;\n        notifyMessageToServerOptions.ApiVersion = EOS_ANTICHEATCLIENT_ADDNOTIFYMESSAGETOSERVER_API_LATEST;\n        EOS_AntiCheatClient_AddNotifyMessageToServer(s_antiCheatClientInterface, &notifyMessageToServerOptions, nullptr, [](const EOS_AntiCheatClient_OnMessageToServerCallbackInfo *data) {\n            PackedByteArray buffer;\n            buffer.resize(data->MessageDataSizeBytes);\n            std::memcpy(buffer.ptrw(), data->MessageData, data->MessageDataSizeBytes);\n\n            Dictionary ret;\n            ret[\"message_data\"] = buffer;\n            IEOS::get_singleton()->emit_signal(\"anticheat_client_interface_message_to_server_callback\", ret);\n        });\n\n        EOS_AntiCheatClient_AddNotifyMessageToPeerOptions notifyMessageToPeerOptions;\n        notifyMessageToPeerOptions.ApiVersion = EOS_ANTICHEATCLIENT_ADDNOTIFYMESSAGETOPEER_API_LATEST;\n        EOS_AntiCheatClient_AddNotifyMessageToPeer(s_antiCheatClientInterface, &notifyMessageToPeerOptions, nullptr, [](const EOS_AntiCheatCommon_OnMessageToClientCallbackInfo *data) {\n            PackedByteArray buffer;\n            buffer.resize(data->MessageDataSizeBytes);\n            std::memcpy(buffer.ptrw(), data->MessageData, data->MessageDataSizeBytes);\n\n            String client_handle = IEOS::get_singleton()->_anticheat_player_handle_to_id(data->ClientHandle);\n\n            Dictionary ret;\n            ret[\"client_handle\"] = client_handle;\n            ret[\"message_data\"] = buffer;\n            IEOS::get_singleton()->emit_signal(\"anticheat_client_interface_message_to_peer_callback\", ret);\n        });\n\n        EOS_AntiCheatClient_AddNotifyPeerActionRequiredOptions notifyPeerActionRequiredOptions;\n        notifyPeerActionRequiredOptions.ApiVersion = EOS_ANTICHEATCLIENT_ADDNOTIFYPEERACTIONREQUIRED_API_LATEST;\n        EOS_AntiCheatClient_AddNotifyPeerActionRequired(s_antiCheatClientInterface, &notifyPeerActionRequiredOptions, nullptr, [](const EOS_AntiCheatCommon_OnClientActionRequiredCallbackInfo *data) {\n            String client_handle = IEOS::get_singleton()->_anticheat_player_handle_to_id(data->ClientHandle);\n            Dictionary ret;\n            ret[\"client_handle\"] = client_handle;\n            ret[\"client_action\"] = static_cast<int>(data->ClientAction);\n            ret[\"action_reason_code\"] = static_cast<int>(data->ActionReasonCode);\n            ret[\"action_reason_details_string\"] = EOSG_GET_STRING(data->ActionReasonDetailsString);\n        });\n\n        EOS_AntiCheatClient_AddNotifyPeerAuthStatusChangedOptions notifyPeerAuthStatusChangedOptions;\n        notifyPeerAuthStatusChangedOptions.ApiVersion = EOS_ANTICHEATCLIENT_ADDNOTIFYPEERAUTHSTATUSCHANGED_API_LATEST;\n        EOS_AntiCheatClient_AddNotifyPeerAuthStatusChanged(s_antiCheatClientInterface, &notifyPeerAuthStatusChangedOptions, nullptr, [](const EOS_AntiCheatCommon_OnClientAuthStatusChangedCallbackInfo *data) {\n            String client_handle = IEOS::get_singleton()->_anticheat_player_handle_to_id(data->ClientHandle);\n            Dictionary ret;\n            ret[\"client_handle\"] = client_handle;\n            ret[\"client_auth_status\"] = static_cast<int>(data->ClientAuthStatus);\n        });\n\n        EOS_AntiCheatClient_AddNotifyClientIntegrityViolatedOptions notifyClientIntegrityViolatedOptions;\n        notifyClientIntegrityViolatedOptions.ApiVersion = EOS_ANTICHEATCLIENT_ADDNOTIFYCLIENTINTEGRITYVIOLATED_API_LATEST;\n        EOS_AntiCheatClient_AddNotifyClientIntegrityViolated(s_antiCheatClientInterface, &notifyClientIntegrityViolatedOptions, nullptr, [](const EOS_AntiCheatClient_OnClientIntegrityViolatedCallbackInfo *data) {\n            Dictionary ret;\n            ret[\"violation_type\"] = static_cast<int>(data->ViolationType);\n            ret[\"violation_message\"] = EOSG_GET_STRING(data->ViolationMessage);\n            IEOS::get_singleton()->emit_signal(\"anticheat_client_interface_client_integrity_violated_callback\", ret);\n        });\n    }\n\n    return true;\n}\n\nDictionary IEOS::platform_interface_get_active_country_code(const String &p_local_user_id) {\n    ERR_FAIL_NULL_V(s_platformInterface, {});\n    CharString user_id = p_local_user_id.utf8();\n    EOS_EpicAccountId localUserId = EOS_EpicAccountId_FromString(user_id.get_data());\n    char *OutBuffer = (char *)memalloc(EOS_COUNTRYCODE_MAX_LENGTH + 1);\n    int OutBufferLength = 0;\n    EOS_EResult res = EOS_Platform_GetActiveCountryCode(s_platformInterface, localUserId, OutBuffer, &OutBufferLength);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"country_code\"] = \"\";\n    if (res == EOS_EResult::EOS_Success) {\n        ret[\"country_code\"] = String(OutBuffer);\n    }\n    memfree(OutBuffer);\n    return ret;\n}\n\nDictionary IEOS::platform_interface_get_active_locale_code(const String &p_user_id) {\n    ERR_FAIL_NULL_V(s_platformInterface, {});\n    CharString user_id = p_user_id.utf8();\n    EOS_EpicAccountId LocalUserId = EOS_EpicAccountId_FromString(user_id.get_data());\n    char *OutBuffer = (char *)memalloc(EOS_LOCALECODE_MAX_LENGTH + 1);\n    int OutBufferLength = 0;\n    EOS_EResult res = EOS_Platform_GetActiveLocaleCode(s_platformInterface, LocalUserId, OutBuffer, &OutBufferLength);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"locale_code\"] = \"\";\n    if (res == EOS_EResult::EOS_Success) {\n        ret[\"locale_code\"] = String(OutBuffer);\n    }\n    memfree(OutBuffer);\n    return ret;\n}\n\nDictionary IEOS::platform_interface_get_override_country_code() {\n    ERR_FAIL_NULL_V(s_platformInterface, {});\n    char *OutBuffer = (char *)memalloc(EOS_COUNTRYCODE_MAX_LENGTH + 1);\n    int32_t *OutBufferLength = (int32_t *)memalloc(sizeof(int32_t));\n    EOS_EResult res = EOS_Platform_GetOverrideCountryCode(s_platformInterface, OutBuffer, OutBufferLength);\n\n    Dictionary dict;\n    dict[\"result_code\"] = static_cast<int>(res);\n    dict[\"country_code\"] = \"\";\n    if (res == EOS_EResult::EOS_Success) {\n        dict[\"country_code\"] = String(OutBuffer);\n    }\n    memfree(OutBuffer);\n    memfree(OutBufferLength);\n    return dict;\n}\n\nDictionary IEOS::platform_interface_get_override_locale_code() {\n    ERR_FAIL_NULL_V(s_platformInterface, {});\n    char *OutBuffer = (char *)memalloc(EOS_LOCALECODE_MAX_LENGTH + 1);\n    int32_t *OutBufferLength = (int32_t *)memalloc(sizeof(int32_t));\n    EOS_EResult res = EOS_Platform_GetOverrideLocaleCode(s_platformInterface, OutBuffer, OutBufferLength);\n\n    Dictionary dict;\n    dict[\"result_code\"] = static_cast<int>(res);\n    dict[\"locale_code\"] = \"\";\n    if (res == EOS_EResult::EOS_Success) {\n        dict[\"locale_code\"] = String(OutBuffer);\n    }\n    memfree(OutBuffer);\n    memfree(OutBufferLength);\n    return dict;\n}\n\nint IEOS::platform_interface_set_override_country_code(const String &p_country_code) {\n    ERR_FAIL_NULL_V(s_platformInterface, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    CharString country_code = p_country_code.utf8();\n    return static_cast<int>(EOS_Platform_SetOverrideCountryCode(s_platformInterface, country_code.get_data()));\n}\n\nint IEOS::platform_interface_set_override_locale_code(const String &p_locale_code) {\n    ERR_FAIL_NULL_V(s_platformInterface, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    CharString locale_code = p_locale_code.utf8();\n    return static_cast<int>(EOS_Platform_SetOverrideLocaleCode(s_platformInterface, locale_code.get_data()));\n}\n\nint IEOS::platform_interface_check_for_launcher_and_restart() {\n    ERR_FAIL_NULL_V(s_platformInterface, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    return static_cast<int>(EOS_Platform_CheckForLauncherAndRestart(s_platformInterface));\n}\n\nint IEOS::platform_interface_initialize(Ref<RefCounted> p_options) {\n    CharString productName = VARIANT_TO_CHARSTRING(p_options->get(\"product_name\"));\n    CharString productVersion = VARIANT_TO_CHARSTRING(p_options->get(\"product_version\"));\n\n    EOS_InitializeOptions initOptions;\n    memset(&initOptions, 0, sizeof(initOptions));\n    initOptions.ApiVersion = EOS_INITIALIZE_API_LATEST;\n    initOptions.ProductName = productName.get_data();\n    initOptions.ProductVersion = productVersion.get_data();\n    initOptions.AllocateMemoryFunction = nullptr;\n    initOptions.ReallocateMemoryFunction = nullptr;\n    initOptions.ReleaseMemoryFunction = nullptr;\n    initOptions.Reserved = nullptr;\n    // TODO: Implement EOS_Android_InitializeOptions for Android\n    initOptions.SystemInitializeOptions = nullptr;\n    initOptions.OverrideThreadAffinity = nullptr;\n\n    EOS_EResult res = EOS_Initialize(&initOptions);\n\n    EOS_EResult setCallbackResult = EOS_Logging_SetCallback([](const EOS_LogMessage *logMessage) {\n        Dictionary logMsg;\n        logMsg[\"category\"] = logMessage->Category;\n        logMsg[\"message\"] = logMessage->Message;\n        logMsg[\"level\"] = (int)logMessage->Level;\n        IEOS::get_singleton()->emit_signal(\"logging_interface_callback\", logMsg);\n    });\n\n    if (setCallbackResult != EOS_EResult::EOS_Success) {\n        UtilityFunctions::print(\"[EOSG] Failed to set logging callback: \" + String(EOS_EResult_ToString(setCallbackResult)));\n    }\n\n    return static_cast<int>(res);\n}\n\nDictionary IEOS::platform_interface_get_desktop_crossplay_status_info() {\n    ERR_FAIL_NULL_V(s_platformInterface, {});\n    EOS_Platform_GetDesktopCrossplayStatusOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_PLATFORM_GETDESKTOPCROSSPLAYSTATUS_API_LATEST;\n    EOS_Platform_DesktopCrossplayStatusInfo outDesktopCrossplayStatusInfo;\n    EOS_EResult result = EOS_Platform_GetDesktopCrossplayStatus(s_platformInterface, &options, &outDesktopCrossplayStatusInfo);\n\n    Dictionary dict;\n    dict[\"result_code\"] = static_cast<int>(result);\n    Dictionary desktopCrossplayStatus = Dictionary();\n    if (result == EOS_EResult::EOS_Success) {\n        desktopCrossplayStatus[\"status\"] = static_cast<int>(outDesktopCrossplayStatusInfo.Status);\n        desktopCrossplayStatus[\"service_init_result\"] = static_cast<int>(outDesktopCrossplayStatusInfo.ServiceInitResult);\n    }\n    dict[\"desktop_crossplay_status\"] = desktopCrossplayStatus;\n    return dict;\n}\n\nint IEOS::platform_interface_set_application_status(int p_status) {\n    ERR_FAIL_NULL_V(s_platformInterface, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    EOS_EResult result = EOS_Platform_SetApplicationStatus(s_platformInterface, static_cast<EOS_EApplicationStatus>(p_status));\n    return static_cast<int>(result);\n}\n\nint IEOS::platform_interface_get_application_status() {\n    ERR_FAIL_NULL_V(s_platformInterface, static_cast<int>(EOS_EApplicationStatus::EOS_AS_Foreground));\n    EOS_EApplicationStatus status = EOS_Platform_GetApplicationStatus(s_platformInterface);\n    return static_cast<int>(status);\n}\n\nint IEOS::platform_interface_set_network_status(int p_status) {\n    ERR_FAIL_NULL_V(s_platformInterface, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    EOS_EResult result = EOS_Platform_SetNetworkStatus(s_platformInterface, static_cast<EOS_ENetworkStatus>(p_status));\n    return static_cast<int>(result);\n}\n\nint IEOS::platform_interface_get_network_status() {\n    ERR_FAIL_NULL_V(s_platformInterface, static_cast<int>(EOS_ENetworkStatus::EOS_NS_Online));\n    EOS_ENetworkStatus status = EOS_Platform_GetNetworkStatus(s_platformInterface);\n    return static_cast<int>(status);\n}\n\nvoid IEOS::platform_interface_release() {\n    isEOSValid = false;\n\n    s_achievementsInterface = nullptr;\n    s_authInterface = nullptr;\n    s_connectInterface = nullptr;\n    s_customInvitesInterface = nullptr;\n    s_ecomInterface = nullptr;\n    s_friendsInterface = nullptr;\n    s_kwsInterface = nullptr;\n    s_leaderboardsInterface = nullptr;\n    s_lobbyInterface = nullptr;\n    s_metricsInterface = nullptr;\n    s_modsInterface = nullptr;\n    s_p2pInterface = nullptr;\n    s_playerDataStorageInterface = nullptr;\n    s_presenceInterface = nullptr;\n    s_progressionSnapshotInterface = nullptr;\n    s_reportsInterface = nullptr;\n    s_rtcAudioInterface = nullptr;\n    s_rtcDataInterface = nullptr;\n    s_rtcInterface = nullptr;\n    s_sanctionsInterface = nullptr;\n    s_sessionsInterface = nullptr;\n    s_statsInterface = nullptr;\n    s_titleStorageInterface = nullptr;\n    s_uiInterface = nullptr;\n    s_userInfoInterface = nullptr;\n    s_antiCheatServerInterface = nullptr;\n    s_antiCheatClientInterface = nullptr;\n\n    if (s_platformInterface != nullptr) {\n        EOS_Platform_Release(s_platformInterface);\n        s_platformInterface = nullptr;\n    }\n}\n\nint IEOS::platform_interface_shutdown() {\n    isEOSValid = false;\n    EOS_EResult res = EOS_Shutdown();\n    return static_cast<int>(res);\n}\n"
  },
  {
    "path": "src/playerdatastorage_interface.cpp",
    "content": "#include \"godot_cpp/variant/packed_byte_array.hpp\"\n#include \"ieos.h\"\n\nusing namespace godot;\n\nvoid IEOS::playerdatastorage_interface_query_file(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL(s_playerDataStorageInterface);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString filename = VARIANT_TO_CHARSTRING(p_options->get(\"filename\"));\n\n    EOS_PlayerDataStorage_QueryFileOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_PLAYERDATASTORAGE_QUERYFILE_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.Filename = filename.get_data();\n    p_options->reference();\n\n    EOS_PlayerDataStorage_QueryFile(s_playerDataStorageInterface, &options, (void *)*p_options, [](const EOS_PlayerDataStorage_QueryFileCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n        IEOS::get_singleton()->emit_signal(\"playerdatastorage_interface_query_file_callback\", ret);\n    });\n}\n\nvoid IEOS::playerdatastorage_interface_query_file_list(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL(s_playerDataStorageInterface);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n\n    EOS_PlayerDataStorage_QueryFileListOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_PLAYERDATASTORAGE_QUERYFILELIST_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    p_options->reference();\n\n    EOS_PlayerDataStorage_QueryFileList(s_playerDataStorageInterface, &options, (void *)*p_options, [](const EOS_PlayerDataStorage_QueryFileListCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n        ret[\"file_count\"] = static_cast<int>(data->FileCount);\n        IEOS::get_singleton()->emit_signal(\"playerdatastorage_interface_query_file_list_callback\", ret);\n    });\n}\n\nDictionary IEOS::playerdatastorage_interface_copy_file_metadata_by_filename(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL_V(s_playerDataStorageInterface, {});\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString filename = VARIANT_TO_CHARSTRING(p_options->get(\"filename\"));\n\n    EOS_PlayerDataStorage_CopyFileMetadataByFilenameOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_PLAYERDATASTORAGE_COPYFILEMETADATABYFILENAME_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.Filename = filename.get_data();\n\n    EOS_PlayerDataStorage_FileMetadata *outMetadata = nullptr;\n    EOS_EResult res = EOS_PlayerDataStorage_CopyFileMetadataByFilename(s_playerDataStorageInterface, &options, &outMetadata);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"metadata\"] = eosg_playerdatastorage_file_metadata_to_dict_and_release(outMetadata);\n    return ret;\n}\n\nDictionary IEOS::playerdatastorage_interface_get_file_metadata_count(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL_V(s_playerDataStorageInterface, {});\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n\n    EOS_PlayerDataStorage_GetFileMetadataCountOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_PLAYERDATASTORAGE_GETFILEMETADATACOUNT_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n\n    int32_t outFileMetadataCount = 0;\n    EOS_EResult res = EOS_PlayerDataStorage_GetFileMetadataCount(s_playerDataStorageInterface, &options, &outFileMetadataCount);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"file_metadata_count\"] = outFileMetadataCount;\n    return ret;\n}\n\nDictionary IEOS::playerdatastorage_interface_copy_file_metadata_at_index(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL_V(s_playerDataStorageInterface, {});\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    int index = p_options->get(\"index\");\n\n    EOS_PlayerDataStorage_CopyFileMetadataAtIndexOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_PLAYERDATASTORAGE_COPYFILEMETADATAATINDEX_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.Index = static_cast<uint32_t>(index);\n\n    EOS_PlayerDataStorage_FileMetadata *outMetadata = nullptr;\n    EOS_EResult res = EOS_PlayerDataStorage_CopyFileMetadataAtIndex(s_playerDataStorageInterface, &options, &outMetadata);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"metadata\"] = eosg_playerdatastorage_file_metadata_to_dict_and_release(outMetadata);\n    return ret;\n}\n\nvoid IEOS::playerdatastorage_interface_duplicate_file(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL(s_playerDataStorageInterface);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString source_filename = VARIANT_TO_CHARSTRING(p_options->get(\"source_filename\"));\n    CharString destination_filename = VARIANT_TO_CHARSTRING(p_options->get(\"destination_filename\"));\n\n    EOS_PlayerDataStorage_DuplicateFileOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_PLAYERDATASTORAGE_DUPLICATEFILE_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.SourceFilename = source_filename.get_data();\n    options.DestinationFilename = destination_filename.get_data();\n    p_options->reference();\n\n    EOS_PlayerDataStorage_DuplicateFile(s_playerDataStorageInterface, &options, (void *)*p_options, [](const EOS_PlayerDataStorage_DuplicateFileCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n        IEOS::get_singleton()->emit_signal(\"playerdatastorage_interface_duplicate_file_callback\", ret);\n    });\n}\n\nvoid IEOS::playerdatastorage_interface_delete_file(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL(s_playerDataStorageInterface);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString filename = VARIANT_TO_CHARSTRING(p_options->get(\"filename\"));\n\n    EOS_PlayerDataStorage_DeleteFileOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_PLAYERDATASTORAGE_DELETEFILE_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.Filename = filename.get_data();\n    p_options->reference();\n\n    EOS_PlayerDataStorage_DeleteFile(s_playerDataStorageInterface, &options, (void *)*p_options, [](const EOS_PlayerDataStorage_DeleteFileCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n        IEOS::get_singleton()->emit_signal(\"playerdatastorage_interface_delete_file_callback\", ret);\n    });\n}\n\nint IEOS::playerdatastorage_interface_delete_cache(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL_V(s_playerDataStorageInterface, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n\n    EOS_PlayerDataStorage_DeleteCacheOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_PLAYERDATASTORAGE_DELETECACHE_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    p_options->reference();\n\n    EOS_EResult res = EOS_PlayerDataStorage_DeleteCache(s_playerDataStorageInterface, &options, (void *)*p_options, [](const EOS_PlayerDataStorage_DeleteCacheCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n        IEOS::get_singleton()->emit_signal(\"playerdatastorage_interface_delete_cache_callback\", ret);\n    });\n\n    return static_cast<int>(res);\n}\n\nVariant IEOS::playerdatastorage_interface_read_file(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL_V(s_playerDataStorageInterface, Variant());\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString filename = VARIANT_TO_CHARSTRING(p_options->get(\"filename\"));\n    int read_chunk_length_bytes = p_options->get(\"read_chunk_length_bytes\");\n\n    EOS_PlayerDataStorage_ReadFileOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_PLAYERDATASTORAGE_READFILE_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.Filename = filename.get_data();\n    options.ReadChunkLengthBytes = static_cast<uint32_t>(read_chunk_length_bytes);\n    options.ReadFileDataCallback = [](const EOS_PlayerDataStorage_ReadFileDataCallbackInfo *data) {\n        Dictionary ret;\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n        ret[\"filename\"] = data->Filename;\n        ret[\"total_file_size_bytes\"] = static_cast<int>(data->TotalFileSizeBytes);\n        ret[\"is_last_chunk\"] = EOSG_GET_BOOL(data->bIsLastChunk);\n        ret[\"data_chunk_length_bytes\"] = static_cast<int>(data->DataChunkLengthBytes);\n\n        // Copy data into a PackedByteArray\n        PackedByteArray data_chunk;\n        data_chunk.resize(data->DataChunkLengthBytes);\n        memcpy(data_chunk.ptrw(), data->DataChunk, data->DataChunkLengthBytes);\n        ret[\"data_chunk\"] = data_chunk;\n\n        IEOS::get_singleton()->emit_signal(\"playerdatastorage_interface_read_file_data_callback\", ret);\n        // TODO: emit the signal on the EOSGFileTransferRequest object instead of IEOS\n        return EOS_PlayerDataStorage_EReadResult::EOS_RR_ContinueReading;\n    };\n    options.FileTransferProgressCallback = [](const EOS_PlayerDataStorage_FileTransferProgressCallbackInfo *data) {\n        Dictionary ret;\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n        ret[\"filename\"] = data->Filename;\n        ret[\"bytes_transferred\"] = static_cast<int>(data->BytesTransferred);\n        ret[\"total_file_size_bytes\"] = static_cast<int>(data->TotalFileSizeBytes);\n        IEOS::get_singleton()->emit_signal(\"playerdatastorage_interface_file_transfer_progress_callback\", ret);\n        // TODO: emit the signal on the EOSGFileTransferRequest object instead of IEOS\n    };\n    p_options->reference();\n\n    EOS_HPlayerDataStorageFileTransferRequest fileTranferRequest = EOS_PlayerDataStorage_ReadFile(s_playerDataStorageInterface, &options, (void *)*p_options, [](const EOS_PlayerDataStorage_ReadFileCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n        ret[\"filename\"] = data->Filename;\n        IEOS::get_singleton()->emit_signal(\"playerdatastorage_interface_read_file_callback\", ret);\n    });\n\n    return eosg_playerdatastorage_file_tranfer_request_to_wrapper(fileTranferRequest);\n}\n\nVariant IEOS::playerdatastorage_interface_write_file(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL_V(s_playerDataStorageInterface, Variant());\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString filename = VARIANT_TO_CHARSTRING(p_options->get(\"filename\"));\n    PackedByteArray data = p_options->get(\"data\");\n    int chunk_length_bytes = p_options->get(\"chunk_length_bytes\");\n\n    EOS_PlayerDataStorage_WriteFileOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_PLAYERDATASTORAGE_WRITEFILE_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.Filename = filename.get_data();\n    options.ChunkLengthBytes = static_cast<uint32_t>(chunk_length_bytes);\n    // has the signature\n\n    options.WriteFileDataCallback = [](const EOS_PlayerDataStorage_WriteFileDataCallbackInfo *data, void *outDataBuffer, uint32_t *bytesWritten) {\n        Dictionary ret;\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n        ret[\"filename\"] = data->Filename;\n        ret[\"data_buffer_length_bytes\"] = static_cast<int>(data->DataBufferLengthBytes);\n\n        int written_buffer_length_bytes = 0;\n        if (client_data->get(\"written_buffer_length_bytes\")) {\n            written_buffer_length_bytes = client_data->get(\"written_buffer_length_bytes\");\n        }\n\n        PackedByteArray data_buffer = client_data->get(\"data\");\n        int chunk_length_bytes = client_data->get(\"chunk_length_bytes\");\n\n        IEOS::get_singleton()->emit_signal(\"playerdatastorage_interface_write_file_data_callback\", ret);\n\n        uint32_t bytes_to_write = std::min((uint32_t)chunk_length_bytes, (uint32_t)(data_buffer.size() - written_buffer_length_bytes));\n        if (bytes_to_write > 0) {\n            memcpy(outDataBuffer, data_buffer.ptr() + written_buffer_length_bytes, bytes_to_write);\n            *bytesWritten = static_cast<uint32_t>(bytes_to_write);\n            written_buffer_length_bytes += bytes_to_write;\n            client_data->set(\"written_buffer_length_bytes\", written_buffer_length_bytes);\n\n            if (written_buffer_length_bytes == data_buffer.size()) {\n                return EOS_PlayerDataStorage_EWriteResult::EOS_WR_CompleteRequest;\n            }\n            return EOS_PlayerDataStorage_EWriteResult::EOS_WR_ContinueWriting;\n        }\n        return EOS_PlayerDataStorage_EWriteResult::EOS_WR_CompleteRequest;\n    };\n    options.FileTransferProgressCallback = [](const EOS_PlayerDataStorage_FileTransferProgressCallbackInfo *data) {\n        Dictionary ret;\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n        ret[\"filename\"] = data->Filename;\n        ret[\"bytes_transferred\"] = static_cast<int>(data->BytesTransferred);\n        ret[\"total_file_size_bytes\"] = static_cast<int>(data->TotalFileSizeBytes);\n        IEOS::get_singleton()->emit_signal(\"playerdatastorage_interface_file_transfer_progress_callback\", ret);\n        // TODO: emit the signal on the EOSGFileTransferRequest object instead of IEOS\n    };\n    p_options->reference();\n\n    EOS_HPlayerDataStorageFileTransferRequest fileTranferRequest = EOS_PlayerDataStorage_WriteFile(s_playerDataStorageInterface, &options, (void *)*p_options, [](const EOS_PlayerDataStorage_WriteFileCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n        ret[\"filename\"] = data->Filename;\n        IEOS::get_singleton()->emit_signal(\"playerdatastorage_interface_write_file_callback\", ret);\n    });\n\n    return eosg_playerdatastorage_file_tranfer_request_to_wrapper(fileTranferRequest);\n}"
  },
  {
    "path": "src/presence_interface.cpp",
    "content": "#include \"ieos.h\"\nusing namespace std;\n\nDictionary IEOS::presence_interface_copy_presence(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_presenceInterface, {});\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString target_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"target_user_id\"));\n\n    EOS_Presence_CopyPresenceOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_PRESENCE_COPYPRESENCE_API_LATEST;\n    options.LocalUserId = eosg_string_to_epic_account_id(local_user_id.get_data());\n    options.TargetUserId = eosg_string_to_epic_account_id(target_user_id.get_data());\n\n    EOS_Presence_Info *outPresenceInfo = nullptr;\n    EOS_EResult res = EOS_Presence_CopyPresence(s_presenceInterface, &options, &outPresenceInfo);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"presence_info\"] = eosg_presence_presence_info_to_dict_and_release(outPresenceInfo);\n    return ret;\n}\n\nDictionary IEOS::presence_interface_create_presence_modification(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_presenceInterface, {});\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n\n    EOS_Presence_CreatePresenceModificationOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_PRESENCE_CREATEPRESENCEMODIFICATION_API_LATEST;\n    options.LocalUserId = eosg_string_to_epic_account_id(local_user_id.get_data());\n\n    EOS_HPresenceModification outPresenceModification = nullptr;\n    EOS_EResult res = EOS_Presence_CreatePresenceModification(s_presenceInterface, &options, &outPresenceModification);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"presence_modification\"] = eosg_presence_presence_modification_to_wrapper(outPresenceModification);\n    return ret;\n}\n\nDictionary IEOS::presence_interface_get_join_info(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_presenceInterface, {});\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString target_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"target_user_id\"));\n\n    EOS_Presence_GetJoinInfoOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_PRESENCE_GETJOININFO_API_LATEST;\n    options.LocalUserId = eosg_string_to_epic_account_id(local_user_id.get_data());\n    options.TargetUserId = eosg_string_to_epic_account_id(target_user_id.get_data());\n\n    char *outBuffer = (char *)memalloc(EOS_PRESENCEMODIFICATION_JOININFO_MAX_LENGTH + 1);\n    int outBufferLength = EOS_PRESENCEMODIFICATION_JOININFO_MAX_LENGTH + 1;\n\n    EOS_EResult res = EOS_Presence_GetJoinInfo(s_presenceInterface, &options, outBuffer, &outBufferLength);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"join_info\"] = outBuffer;\n    return ret;\n}\n\nbool IEOS::presence_interface_has_presence(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_presenceInterface, false);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString target_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"target_user_id\"));\n\n    EOS_Presence_HasPresenceOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_PRESENCE_HASPRESENCE_API_LATEST;\n    options.LocalUserId = eosg_string_to_epic_account_id(local_user_id.get_data());\n    options.TargetUserId = eosg_string_to_epic_account_id(target_user_id.get_data());\n\n    return EOSG_GET_BOOL(\n            EOS_Presence_HasPresence(s_presenceInterface, &options));\n}\n\nvoid IEOS::presence_interface_query_presence(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_presenceInterface);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString target_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"target_user_id\"));\n\n    EOS_Presence_QueryPresenceOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_PRESENCE_QUERYPRESENCE_API_LATEST;\n    options.LocalUserId = eosg_string_to_epic_account_id(local_user_id.get_data());\n    options.TargetUserId = eosg_string_to_epic_account_id(target_user_id.get_data());\n    p_options->reference();\n\n    EOS_Presence_QueryPresence(s_presenceInterface, &options, (void *)*p_options, [](const EOS_Presence_QueryPresenceCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"local_user_id\"] = eosg_epic_account_id_to_string(data->LocalUserId);\n        ret[\"target_user_id\"] = eosg_epic_account_id_to_string(data->TargetUserId);\n        IEOS::get_singleton()->emit_signal(\"presence_interface_query_presence_callback\", ret);\n    });\n}\n\nvoid IEOS::presence_interface_set_presence(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_presenceInterface);\n    Ref<EOSGPresenceModification> presence_modification = Object::cast_to<EOSGPresenceModification>(p_options->get(\"presence_modification\"));\n    ERR_FAIL_NULL_MSG(presence_modification, \"Error setting presence. SetPresenceOptions.presence_modification is null.\");\n    ERR_FAIL_NULL_MSG(presence_modification->get_internal(), \"Error setting presence. EOSGPresenceModification is null.\");\n\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n\n    EOS_Presence_SetPresenceOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_PRESENCE_SETPRESENCE_API_LATEST;\n    options.LocalUserId = eosg_string_to_epic_account_id(local_user_id.get_data());\n    options.PresenceModificationHandle = presence_modification->get_internal();\n    p_options->reference();\n\n    EOS_Presence_SetPresence(s_presenceInterface, &options, (void *)*p_options, [](const EOS_Presence_SetPresenceCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"local_user_id\"] = eosg_epic_account_id_to_string(data->LocalUserId);\n        ret[\"rich_presence_result_code\"] = static_cast<int>(data->RichPresenceResultCode);\n        IEOS::get_singleton()->emit_signal(\"presence_interface_set_presence_callback\", ret);\n    });\n}\n"
  },
  {
    "path": "src/progression_snapshot_interface.cpp",
    "content": "#include \"ieos.h\"\nusing namespace std;\n\nDictionary IEOS::progression_snapshot_interface_begin_snapshot(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL_V(s_progressionSnapshotInterface, {});\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n\n    EOS_ProgressionSnapshot_BeginSnapshotOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_PROGRESSIONSNAPSHOT_BEGINSNAPSHOT_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n\n    uint32_t outSnapshotId = 0;\n    EOS_EResult res = EOS_ProgressionSnapshot_BeginSnapshot(s_progressionSnapshotInterface, &options, &outSnapshotId);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"snapshot_id\"] = outSnapshotId;\n    return ret;\n}\n\nint IEOS::progression_snapshot_interface_add_progression(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL_V(s_progressionSnapshotInterface, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    CharString key = VARIANT_TO_CHARSTRING(p_options->get(\"key\"));\n    CharString value = VARIANT_TO_CHARSTRING(p_options->get(\"value\"));\n\n    EOS_ProgressionSnapshot_AddProgressionOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_PROGRESSIONSNAPSHOT_ADDPROGRESSION_API_LATEST;\n    options.SnapshotId = static_cast<uint32_t>(static_cast<int>(p_options->get(\"snapshot_id\")));\n    options.Key = key.get_data();\n    options.Value = value.get_data();\n\n    return static_cast<int>(EOS_ProgressionSnapshot_AddProgression(s_progressionSnapshotInterface, &options));\n}\n\nvoid IEOS::progression_snapshot_interface_submit_snapshot(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL(s_progressionSnapshotInterface);\n    EOS_ProgressionSnapshot_SubmitSnapshotOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_PROGRESSIONSNAPSHOT_SUBMITSNAPSHOT_API_LATEST;\n    options.SnapshotId = static_cast<uint32_t>(static_cast<int>(p_options->get(\"snapshot_id\")));\n    p_options->reference();\n\n    EOS_ProgressionSnapshot_SubmitSnapshot(s_progressionSnapshotInterface, &options, (void *)*p_options, [](const EOS_ProgressionSnapshot_SubmitSnapshotCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"snapshot_id\"] = static_cast<int>(data->SnapshotId);\n        IEOS::get_singleton()->emit_signal(\"progression_snapshot_interface_submit_snapshot_callback\", ret);\n    });\n}\n\nvoid IEOS::progression_snapshot_interface_delete_snapshot(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL(s_progressionSnapshotInterface);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n\n    EOS_ProgressionSnapshot_DeleteSnapshotOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_PROGRESSIONSNAPSHOT_DELETESNAPSHOT_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    p_options->reference();\n\n    EOS_ProgressionSnapshot_DeleteSnapshot(s_progressionSnapshotInterface, &options, (void *)*p_options, [](const EOS_ProgressionSnapshot_DeleteSnapshotCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n        IEOS::get_singleton()->emit_signal(\"progression_snapshot_interface_delete_snapshot_callback\", ret);\n    });\n}\n\nint IEOS::progression_snapshot_interface_end_snapshot(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL_V(s_progressionSnapshotInterface, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    EOS_ProgressionSnapshot_EndSnapshotOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_PROGRESSIONSNAPSHOT_ENDSNAPSHOT_API_LATEST;\n    options.SnapshotId = static_cast<uint32_t>(static_cast<int>(p_options->get(\"snapshot_id\")));\n\n    return static_cast<int>(EOS_ProgressionSnapshot_EndSnapshot(s_progressionSnapshotInterface, &options));\n}\n"
  },
  {
    "path": "src/register_types.cpp",
    "content": "#include \"register_types.h\"\n\n#include \"eosg_active_session.h\"\n#include \"eosg_continuance_token.h\"\n#include \"eosg_file_transfer_request.h\"\n#include \"eosg_lobby_details.h\"\n#include \"eosg_lobby_modification.h\"\n#include \"eosg_lobby_search.h\"\n#include \"eosg_multiplayer_peer.h\"\n#include \"eosg_packet_peer_mediator.h\"\n#include \"eosg_presence_modification.h\"\n#include \"eosg_session_details.h\"\n#include \"eosg_session_modification.h\"\n#include \"eosg_session_search.h\"\n#include \"eosg_transaction.h\"\n#include \"godot_cpp/classes/engine.hpp\"\n#include \"godot_cpp/godot.hpp\"\n#include \"ieos.h\"\n\nusing namespace godot;\n\nstatic IEOS *_ieos;\nstatic EOSGPacketPeerMediator *_mediator;\n\nvoid initialize_eosg_module(ModuleInitializationLevel p_level) {\n    if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {\n        return;\n    }\n\n    ClassDB::register_class<IEOS>();\n    _ieos = memnew(IEOS);\n    Engine::get_singleton()->register_singleton(\"IEOS\", IEOS::get_singleton());\n\n    ClassDB::register_class<godot::EOSGPacketPeerMediator>();\n    _mediator = memnew(EOSGPacketPeerMediator);\n    Engine::get_singleton()->register_singleton(\"EOSGPacketPeerMediator\", EOSGPacketPeerMediator::get_singleton());\n\n    ClassDB::register_abstract_class<godot::EOSGFileTransferRequest>();\n    ClassDB::register_class<godot::EOSGPlayerDataStorageFileTransferRequest>();\n    ClassDB::register_class<godot::EOSGTitleStorageFileTransferRequest>();\n\n    ClassDB::register_class<godot::EOSGActiveSession>();\n    ClassDB::register_class<godot::EOSGContinuanceToken>();\n    ClassDB::register_class<godot::EOSGLobbyDetails>();\n    ClassDB::register_class<godot::EOSGLobbyModification>();\n    ClassDB::register_class<godot::EOSGLobbySearch>();\n    ClassDB::register_class<godot::EOSGMultiplayerPeer>();\n    ClassDB::register_class<godot::EOSGPresenceModification>();\n    ClassDB::register_class<godot::EOSGSessionDetails>();\n    ClassDB::register_class<godot::EOSGSessionModification>();\n    ClassDB::register_class<godot::EOSGSessionSearch>();\n    ClassDB::register_class<godot::EOSGTransaction>();\n}\n\nvoid uninitialize_eosg_module(ModuleInitializationLevel p_level) {\n    if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {\n        return;\n    }\n\n    Engine::get_singleton()->unregister_singleton(\"EOSGPacketPeerMediator\");\n    Engine::get_singleton()->unregister_singleton(\"IEOS\");\n\n    memdelete(_mediator);\n    memdelete(_ieos);\n\n    _mediator = nullptr;\n    _ieos = nullptr;\n}\n\nextern \"C\" {\n// Initialization.\nGDExtensionBool GDE_EXPORT eosg_library_init(GDExtensionInterfaceGetProcAddress p_get_proc_address, const GDExtensionClassLibraryPtr p_library, GDExtensionInitialization *r_initialization) {\n    godot::GDExtensionBinding::InitObject init_obj(p_get_proc_address, p_library, r_initialization);\n\n    init_obj.register_initializer(initialize_eosg_module);\n    init_obj.register_terminator(uninitialize_eosg_module);\n    init_obj.set_minimum_library_initialization_level(MODULE_INITIALIZATION_LEVEL_SCENE);\n\n    return init_obj.init();\n}\n}"
  },
  {
    "path": "src/register_types.h",
    "content": "#pragma once\n\nvoid initialize_eosg_module();\nvoid uninitialize_eosg_module();"
  },
  {
    "path": "src/reports_interface.cpp",
    "content": "#include \"ieos.h\"\nusing namespace std;\n\nvoid IEOS::reports_interface_send_player_behavior_report(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL(s_reportsInterface);\n    CharString reporter_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"reporter_user_id\"));\n    CharString reported_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"reported_user_id\"));\n    CharString message = VARIANT_TO_CHARSTRING(p_options->get(\"message\"));\n    CharString context = VARIANT_TO_CHARSTRING(p_options->get(\"context\"));\n\n    EOS_Reports_SendPlayerBehaviorReportOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_REPORTS_SENDPLAYERBEHAVIORREPORT_API_LATEST;\n    options.ReporterUserId = eosg_string_to_product_user_id(reporter_user_id.get_data());\n    options.ReportedUserId = eosg_string_to_product_user_id(reported_user_id.get_data());\n    options.Category = static_cast<EOS_EPlayerReportsCategory>(static_cast<int>(p_options->get(\"category\")));\n    if (message.length() != 0) {\n        options.Message = message.get_data();\n    }\n    if (context.length() != 0) {\n        options.Context = context.get_data();\n    }\n    p_options->reference();\n\n    EOS_Reports_SendPlayerBehaviorReport(s_reportsInterface, &options, (void *)*p_options, [](const EOS_Reports_SendPlayerBehaviorReportCompleteCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        IEOS::get_singleton()->emit_signal(\"reports_interface_send_player_behavior_report_callback\", ret);\n    });\n}\n"
  },
  {
    "path": "src/rtc_audio_interface.cpp",
    "content": "#include \"godot_cpp/variant/packed_int32_array.hpp\"\n#include \"ieos.h\"\n\nDictionary IEOS::rtc_audio_interface_copy_input_device_information_by_index(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_rtcAudioInterface, {});\n    int device_index = p_options->get(\"device_index\");\n\n    EOS_RTCAudio_CopyInputDeviceInformationByIndexOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_RTCAUDIO_COPYINPUTDEVICEINFORMATIONBYINDEX_API_LATEST;\n    options.DeviceIndex = static_cast<uint32_t>(device_index);\n\n    EOS_RTCAudio_InputDeviceInformation *outInputDeviceInfo;\n    EOS_EResult res = EOS_RTCAudio_CopyInputDeviceInformationByIndex(s_rtcAudioInterface, &options, &outInputDeviceInfo);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"input_device_information\"] = eosg_rtc_audio_input_device_information_to_dict_and_release(outInputDeviceInfo);\n    return ret;\n}\n\nDictionary IEOS::rtc_audio_interface_copy_output_device_information_by_index(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_rtcAudioInterface, {});\n    int device_index = p_options->get(\"device_index\");\n\n    EOS_RTCAudio_CopyOutputDeviceInformationByIndexOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_RTCAUDIO_COPYOUTPUTDEVICEINFORMATIONBYINDEX_API_LATEST;\n    options.DeviceIndex = static_cast<uint32_t>(device_index);\n\n    EOS_RTCAudio_OutputDeviceInformation *outOutputDeviceInfo;\n    EOS_EResult res = EOS_RTCAudio_CopyOutputDeviceInformationByIndex(s_rtcAudioInterface, &options, &outOutputDeviceInfo);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"output_device_information\"] = eosg_rtc_audio_output_device_information_to_dict_and_release(outOutputDeviceInfo);\n    return ret;\n}\n\nint IEOS::rtc_audio_interface_get_input_devices_count(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_rtcAudioInterface, 0);\n    EOS_RTCAudio_GetInputDevicesCountOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_RTCAUDIO_GETINPUTDEVICESCOUNT_API_LATEST;\n\n    return static_cast<int>(EOS_RTCAudio_GetInputDevicesCount(s_rtcAudioInterface, &options));\n}\n\nint IEOS::rtc_audio_interface_get_output_devices_count(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_rtcAudioInterface, 0);\n    EOS_RTCAudio_GetOutputDevicesCountOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_RTCAUDIO_GETOUTPUTDEVICESCOUNT_API_LATEST;\n\n    return static_cast<int>(EOS_RTCAudio_GetOutputDevicesCount(s_rtcAudioInterface, &options));\n}\n\nint IEOS::rtc_audio_interface_send_audio(const Ref<RefCounted> &p_options) {\n    ERR_FAIL_NULL_V(s_rtcAudioInterface, static_cast<int>(EOS_EResult::EOS_InvalidParameters));\n\n    const CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    const CharString room_name = VARIANT_TO_CHARSTRING(p_options->get(\"room_name\"));\n\n    // Extract buffer data from options\n    const int sample_rate = p_options->get(\"sample_rate\");\n    const int channels = p_options->get(\"channels\");\n    PackedInt32Array frames_array = p_options->get(\"frames\");\n    const int frames_count = frames_array.size();\n\n    // Allocate and copy frame data\n    int16_t *frames_data = nullptr;\n    if (frames_count > 0) {\n        frames_data = (int16_t *)memalloc(sizeof(int16_t) * frames_count);\n        for (int i = 0; i < frames_count; i++) {\n            frames_data[i] = static_cast<int16_t>(static_cast<int>(frames_array[i]));\n        }\n    }\n\n    // Setup audio buffer\n    EOS_RTCAudio_AudioBuffer audio_buffer;\n    memset(&audio_buffer, 0, sizeof(audio_buffer));\n    audio_buffer.ApiVersion = EOS_RTCAUDIO_AUDIOBUFFER_API_LATEST;\n    audio_buffer.Frames = frames_data;\n    audio_buffer.FramesCount = static_cast<uint32_t>(frames_count);\n    audio_buffer.SampleRate = static_cast<uint32_t>(sample_rate);\n    audio_buffer.Channels = static_cast<uint32_t>(channels);\n\n    // Setup send audio options\n    EOS_RTCAudio_SendAudioOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_RTCAUDIO_SENDAUDIO_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.RoomName = room_name.get_data();\n    options.Buffer = &audio_buffer;\n\n    EOS_EResult result = EOS_RTCAudio_SendAudio(s_rtcAudioInterface, &options);\n\n    // Free allocated memory\n    if (frames_data != nullptr) {\n        memfree(frames_data);\n    }\n\n    return static_cast<int>(result);\n}\n\nvoid IEOS::rtc_audio_interface_query_input_devices_information(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_rtcAudioInterface);\n    EOS_RTCAudio_QueryInputDevicesInformationOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_RTCAUDIO_QUERYINPUTDEVICESINFORMATION_API_LATEST;\n    p_options->reference();\n\n    EOS_RTCAudio_QueryInputDevicesInformation(s_rtcAudioInterface, &options, (void *)*p_options, [](const EOS_RTCAudio_OnQueryInputDevicesInformationCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        client_data->unreference();\n        IEOS::get_singleton()->emit_signal(\"rtc_audio_interface_query_input_devices_information_callback\", ret);\n    });\n}\n\nvoid IEOS::rtc_audio_interface_query_output_devices_information(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_rtcAudioInterface);\n    EOS_RTCAudio_QueryOutputDevicesInformationOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_RTCAUDIO_QUERYOUTPUTDEVICESINFORMATION_API_LATEST;\n    p_options->reference();\n\n    EOS_RTCAudio_QueryOutputDevicesInformation(s_rtcAudioInterface, &options, (void *)*p_options, [](const EOS_RTCAudio_OnQueryOutputDevicesInformationCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        client_data->unreference();\n        IEOS::get_singleton()->emit_signal(\"rtc_audio_interface_query_output_devices_information_callback\", ret);\n    });\n}\n\nvoid IEOS::rtc_audio_interface_register_platform_user(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_rtcAudioInterface);\n    CharString platform_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"platform_user_id\"));\n\n    EOS_RTCAudio_RegisterPlatformUserOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_RTCAUDIO_REGISTERPLATFORMUSER_API_LATEST;\n    options.PlatformUserId = platform_user_id.get_data();\n    p_options->reference();\n\n    EOS_RTCAudio_RegisterPlatformUser(s_rtcAudioInterface, &options, (void *)*p_options, [](const EOS_RTCAudio_OnRegisterPlatformUserCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        client_data->unreference();\n        ret[\"platform_user_id\"] = EOSG_GET_STRING(data->PlatformUserId);\n        IEOS::get_singleton()->emit_signal(\"rtc_audio_interface_register_platform_user_callback\", ret);\n    });\n}\n\nvoid IEOS::rtc_audio_interface_set_input_device_settings(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_rtcAudioInterface);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString real_device_id = VARIANT_TO_CHARSTRING(p_options->get(\"real_device_id\"));\n    bool platform_aec = p_options->get(\"platform_aec\");\n\n    EOS_RTCAudio_SetInputDeviceSettingsOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_RTCAUDIO_SETINPUTDEVICESETTINGS_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.RealDeviceId = real_device_id.get_data();\n    options.bPlatformAEC = platform_aec ? EOS_TRUE : EOS_FALSE;\n    p_options->reference();\n\n    EOS_RTCAudio_SetInputDeviceSettings(s_rtcAudioInterface, &options, (void *)*p_options, [](const EOS_RTCAudio_OnSetInputDeviceSettingsCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        client_data->unreference();\n        ret[\"real_device_id\"] = EOSG_GET_STRING(data->RealDeviceId);\n        IEOS::get_singleton()->emit_signal(\"rtc_audio_interface_set_input_device_settings_callback\", ret);\n    });\n}\n\nvoid IEOS::rtc_audio_interface_set_output_device_settings(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_rtcAudioInterface);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString real_device_id = VARIANT_TO_CHARSTRING(p_options->get(\"real_device_id\"));\n\n    EOS_RTCAudio_SetOutputDeviceSettingsOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_RTCAUDIO_SETOUTPUTDEVICESETTINGS_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.RealDeviceId = real_device_id.get_data();\n    p_options->reference();\n\n    EOS_RTCAudio_SetOutputDeviceSettings(s_rtcAudioInterface, &options, (void *)*p_options, [](const EOS_RTCAudio_OnSetOutputDeviceSettingsCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        client_data->unreference();\n        ret[\"real_device_id\"] = EOSG_GET_STRING(data->RealDeviceId);\n        IEOS::get_singleton()->emit_signal(\"rtc_audio_interface_set_output_device_settings_callback\", ret);\n    });\n}\n\nvoid IEOS::rtc_audio_interface_unregister_platform_user(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_rtcAudioInterface);\n    CharString platform_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"platform_user_id\"));\n\n    EOS_RTCAudio_UnregisterPlatformUserOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_RTCAUDIO_UNREGISTERPLATFORMUSER_API_LATEST;\n    options.PlatformUserId = platform_user_id.get_data();\n    p_options->reference();\n\n    EOS_RTCAudio_UnregisterPlatformUser(s_rtcAudioInterface, &options, (void *)*p_options, [](const EOS_RTCAudio_OnUnregisterPlatformUserCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        client_data->unreference();\n        ret[\"platform_user_id\"] = EOSG_GET_STRING(data->PlatformUserId);\n        IEOS::get_singleton()->emit_signal(\"rtc_audio_interface_unregister_platform_user_callback\", ret);\n    });\n}\n\nvoid IEOS::rtc_audio_interface_update_participant_volume(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_rtcAudioInterface);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString room_name = VARIANT_TO_CHARSTRING(p_options->get(\"room_name\"));\n    CharString participant_id = VARIANT_TO_CHARSTRING(p_options->get(\"participant_id\"));\n    float volume = p_options->get(\"volume\");\n\n    EOS_RTCAudio_UpdateParticipantVolumeOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_RTCAUDIO_UPDATEPARTICIPANTVOLUME_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.RoomName = room_name.get_data();\n    options.ParticipantId = eosg_string_to_product_user_id(participant_id.get_data());\n    options.Volume = volume;\n    p_options->reference();\n\n    EOS_RTCAudio_UpdateParticipantVolume(s_rtcAudioInterface, &options, (void *)*p_options, [](const EOS_RTCAudio_UpdateParticipantVolumeCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        client_data->unreference();\n        ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n        ret[\"room_name\"] = EOSG_GET_STRING(data->RoomName);\n        ret[\"participant_id\"] = eosg_product_user_id_to_string(data->ParticipantId);\n        ret[\"volume\"] = data->Volume;\n        IEOS::get_singleton()->emit_signal(\"rtc_audio_interface_update_participant_volume_callback\", ret);\n    });\n}\n\nvoid IEOS::rtc_audio_interface_update_receiving_volume(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_rtcAudioInterface);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString room_name = VARIANT_TO_CHARSTRING(p_options->get(\"room_name\"));\n    float volume = p_options->get(\"volume\");\n\n    EOS_RTCAudio_UpdateReceivingVolumeOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_RTCAUDIO_UPDATERECEIVINGVOLUME_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.RoomName = room_name.get_data();\n    options.Volume = volume;\n    p_options->reference();\n\n    EOS_RTCAudio_UpdateReceivingVolume(s_rtcAudioInterface, &options, (void *)*p_options, [](const EOS_RTCAudio_UpdateReceivingVolumeCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        client_data->unreference();\n        ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n        ret[\"room_name\"] = EOSG_GET_STRING(data->RoomName);\n        ret[\"volume\"] = data->Volume;\n        IEOS::get_singleton()->emit_signal(\"rtc_audio_interface_update_receiving_volume_callback\", ret);\n    });\n}\n\nvoid IEOS::rtc_audio_interface_update_receiving(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_rtcAudioInterface);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString room_name = VARIANT_TO_CHARSTRING(p_options->get(\"room_name\"));\n    CharString participant_id = VARIANT_TO_CHARSTRING(p_options->get(\"participant_id\"));\n    bool audio_enabled = p_options->get(\"audio_enabled\");\n\n    EOS_RTCAudio_UpdateReceivingOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_RTCAUDIO_UPDATERECEIVING_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.RoomName = room_name.get_data();\n    options.ParticipantId = eosg_string_to_product_user_id(participant_id.get_data());\n    options.bAudioEnabled = audio_enabled ? EOS_TRUE : EOS_FALSE;\n    p_options->reference();\n\n    EOS_RTCAudio_UpdateReceiving(s_rtcAudioInterface, &options, (void *)*p_options, [](const EOS_RTCAudio_UpdateReceivingCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        client_data->unreference();\n        ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n        ret[\"room_name\"] = EOSG_GET_STRING(data->RoomName);\n        ret[\"participant_id\"] = eosg_product_user_id_to_string(data->ParticipantId);\n        ret[\"audio_enabled\"] = data->bAudioEnabled == EOS_TRUE;\n        IEOS::get_singleton()->emit_signal(\"rtc_audio_interface_update_receiving_callback\", ret);\n    });\n}\n\nvoid IEOS::rtc_audio_interface_update_sending_volume(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_rtcAudioInterface);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString room_name = VARIANT_TO_CHARSTRING(p_options->get(\"room_name\"));\n    float volume = p_options->get(\"volume\");\n\n    EOS_RTCAudio_UpdateSendingVolumeOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_RTCAUDIO_UPDATESENDINGVOLUME_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.RoomName = room_name.get_data();\n    options.Volume = volume;\n    p_options->reference();\n\n    EOS_RTCAudio_UpdateSendingVolume(s_rtcAudioInterface, &options, (void *)*p_options, [](const EOS_RTCAudio_UpdateSendingVolumeCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        client_data->unreference();\n        ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n        ret[\"room_name\"] = EOSG_GET_STRING(data->RoomName);\n        ret[\"volume\"] = data->Volume;\n        IEOS::get_singleton()->emit_signal(\"rtc_audio_interface_update_sending_volume_callback\", ret);\n    });\n}\n\nvoid IEOS::rtc_audio_interface_update_sending(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_rtcAudioInterface);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString room_name = VARIANT_TO_CHARSTRING(p_options->get(\"room_name\"));\n    int audio_status = p_options->get(\"audio_status\");\n\n    EOS_RTCAudio_UpdateSendingOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_RTCAUDIO_UPDATESENDING_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.RoomName = room_name.get_data();\n    options.AudioStatus = static_cast<EOS_ERTCAudioStatus>(audio_status);\n    p_options->reference();\n\n    EOS_RTCAudio_UpdateSending(s_rtcAudioInterface, &options, (void *)*p_options, [](const EOS_RTCAudio_UpdateSendingCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        client_data->unreference();\n        ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n        ret[\"room_name\"] = EOSG_GET_STRING(data->RoomName);\n        ret[\"audio_status\"] = static_cast<int>(data->AudioStatus);\n        IEOS::get_singleton()->emit_signal(\"rtc_audio_interface_update_sending_callback\", ret);\n    });\n}\n\nint IEOS::rtc_audio_interface_add_notify_audio_before_render(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_rtcAudioInterface, static_cast<int>(EOS_INVALID_NOTIFICATIONID));\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString room_name = VARIANT_TO_CHARSTRING(p_options->get(\"room_name\"));\n    bool unmixed_audio = p_options->get(\"unmixed_audio\");\n\n    EOS_RTCAudio_AddNotifyAudioBeforeRenderOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_RTCAUDIO_ADDNOTIFYAUDIOBEFORERENDER_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.RoomName = room_name.get_data();\n    options.bUnmixedAudio = unmixed_audio ? EOS_TRUE : EOS_FALSE;\n\n    EOS_NotificationId notification_id = EOS_RTCAudio_AddNotifyAudioBeforeRender(s_rtcAudioInterface, &options, (void *)*p_options, [](const EOS_RTCAudio_AudioBeforeRenderCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n        ret[\"room_name\"] = EOSG_GET_STRING(data->RoomName);\n        ret[\"buffer\"] = eosg_rtc_audio_audio_buffer_to_dict(data->Buffer);\n        ret[\"participant_id\"] = eosg_product_user_id_to_string(data->ParticipantId);\n        IEOS::get_singleton()->emit_signal(\"rtc_audio_audio_before_render\", ret);\n    });\n\n    return static_cast<int>(notification_id);\n}\n\nint IEOS::rtc_audio_interface_add_notify_audio_before_send(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_rtcAudioInterface, static_cast<int>(EOS_INVALID_NOTIFICATIONID));\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString room_name = VARIANT_TO_CHARSTRING(p_options->get(\"room_name\"));\n\n    EOS_RTCAudio_AddNotifyAudioBeforeSendOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_RTCAUDIO_ADDNOTIFYAUDIOBEFORESEND_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.RoomName = room_name.get_data();\n\n    EOS_NotificationId notification_id = EOS_RTCAudio_AddNotifyAudioBeforeSend(s_rtcAudioInterface, &options, (void *)*p_options, [](const EOS_RTCAudio_AudioBeforeSendCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n        ret[\"room_name\"] = EOSG_GET_STRING(data->RoomName);\n        ret[\"buffer\"] = eosg_rtc_audio_audio_buffer_to_dict(data->Buffer);\n        IEOS::get_singleton()->emit_signal(\"rtc_audio_audio_before_send\", ret);\n    });\n    return static_cast<int>(notification_id);\n}\n\nint IEOS::rtc_audio_interface_add_notify_audio_input_state(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_rtcAudioInterface, static_cast<int>(EOS_INVALID_NOTIFICATIONID));\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString room_name = VARIANT_TO_CHARSTRING(p_options->get(\"room_name\"));\n\n    EOS_RTCAudio_AddNotifyAudioInputStateOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_RTCAUDIO_ADDNOTIFYAUDIOINPUTSTATE_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.RoomName = room_name.get_data();\n\n    EOS_NotificationId notification_id = EOS_RTCAudio_AddNotifyAudioInputState(s_rtcAudioInterface, &options, (void *)*p_options, [](const EOS_RTCAudio_AudioInputStateCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n        ret[\"room_name\"] = EOSG_GET_STRING(data->RoomName);\n        ret[\"status\"] = static_cast<int>(data->Status);\n        IEOS::get_singleton()->emit_signal(\"rtc_audio_audio_input_state\", ret);\n    });\n    return static_cast<int>(notification_id);\n}\n\nint IEOS::rtc_audio_interface_add_notify_audio_output_state(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_rtcAudioInterface, static_cast<int>(EOS_INVALID_NOTIFICATIONID));\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString room_name = VARIANT_TO_CHARSTRING(p_options->get(\"room_name\"));\n\n    EOS_RTCAudio_AddNotifyAudioOutputStateOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_RTCAUDIO_ADDNOTIFYAUDIOOUTPUTSTATE_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.RoomName = room_name.get_data();\n\n    EOS_NotificationId notification_id = EOS_RTCAudio_AddNotifyAudioOutputState(s_rtcAudioInterface, &options, (void *)*p_options, [](const EOS_RTCAudio_AudioOutputStateCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n        ret[\"room_name\"] = EOSG_GET_STRING(data->RoomName);\n        ret[\"status\"] = static_cast<int>(data->Status);\n        IEOS::get_singleton()->emit_signal(\"rtc_audio_audio_output_state\", ret);\n    });\n    return static_cast<int>(notification_id);\n}\n\nint IEOS::rtc_audio_interface_add_notify_participant_updated(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_rtcAudioInterface, static_cast<int>(EOS_INVALID_NOTIFICATIONID));\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString room_name = VARIANT_TO_CHARSTRING(p_options->get(\"room_name\"));\n\n    EOS_RTCAudio_AddNotifyParticipantUpdatedOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_RTCAUDIO_ADDNOTIFYPARTICIPANTUPDATED_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.RoomName = room_name.get_data();\n\n    EOS_NotificationId notification_id = EOS_RTCAudio_AddNotifyParticipantUpdated(s_rtcAudioInterface, &options, (void *)*p_options, [](const EOS_RTCAudio_ParticipantUpdatedCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"room_name\"] = EOSG_GET_STRING(data->RoomName);\n        ret[\"participant_id\"] = eosg_product_user_id_to_string(data->ParticipantId);\n        ret[\"speaking\"] = EOSG_GET_BOOL(data->bSpeaking);\n        ret[\"audio_status\"] = static_cast<int>(data->AudioStatus);\n        IEOS::get_singleton()->emit_signal(\"rtc_audio_participant_updated\", ret);\n    });\n    return static_cast<int>(notification_id);\n}\n\nvoid IEOS::rtc_audio_interface_remove_notify_audio_before_render(int p_notification_id) {\n    ERR_FAIL_NULL(s_rtcAudioInterface);\n    EOS_RTCAudio_RemoveNotifyAudioBeforeRender(s_rtcAudioInterface, static_cast<EOS_NotificationId>(p_notification_id));\n}\n\nvoid IEOS::rtc_audio_interface_remove_notify_audio_before_send(int p_notification_id) {\n    ERR_FAIL_NULL(s_rtcAudioInterface);\n    EOS_RTCAudio_RemoveNotifyAudioBeforeSend(s_rtcAudioInterface, static_cast<EOS_NotificationId>(p_notification_id));\n}\n\nvoid IEOS::rtc_audio_interface_remove_notify_audio_input_state(int p_notification_id) {\n    ERR_FAIL_NULL(s_rtcAudioInterface);\n    EOS_RTCAudio_RemoveNotifyAudioInputState(s_rtcAudioInterface, static_cast<EOS_NotificationId>(p_notification_id));\n}\n\nvoid IEOS::rtc_audio_interface_remove_notify_audio_output_state(int p_notification_id) {\n    ERR_FAIL_NULL(s_rtcAudioInterface);\n    EOS_RTCAudio_RemoveNotifyAudioOutputState(s_rtcAudioInterface, static_cast<EOS_NotificationId>(p_notification_id));\n}\n\nvoid IEOS::rtc_audio_interface_remove_notify_participant_updated(int p_notification_id) {\n    ERR_FAIL_NULL(s_rtcAudioInterface);\n    EOS_RTCAudio_RemoveNotifyParticipantUpdated(s_rtcAudioInterface, static_cast<EOS_NotificationId>(p_notification_id));\n}\n"
  },
  {
    "path": "src/rtc_data_interface.cpp",
    "content": "#include \"ieos.h\"\n\nint IEOS::rtc_data_interface_add_notify_data_received(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_rtcDataInterface, static_cast<int>(EOS_INVALID_NOTIFICATIONID));\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString room_name = VARIANT_TO_CHARSTRING(p_options->get(\"room_name\"));\n\n    EOS_RTCData_AddNotifyDataReceivedOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_RTCDATA_ADDNOTIFYDATARECEIVED_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.RoomName = room_name.get_data();\n\n    return static_cast<int>(EOS_RTCData_AddNotifyDataReceived(s_rtcDataInterface, &options, (void *)*p_options, [](const EOS_RTCData_DataReceivedCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n        ret[\"room_name\"] = EOSG_GET_STRING(data->RoomName);\n        ret[\"data_length_bytes\"] = data->DataLengthBytes;\n        PackedByteArray data_arr;\n        data_arr.resize(data->DataLengthBytes);\n        memcpy(data_arr.ptrw(), data->Data, data->DataLengthBytes);\n        ret[\"data\"] = data_arr;\n        IEOS::get_singleton()->emit_signal(\"rtc_data_data_received\", ret);\n    }));\n}\n\nint IEOS::rtc_data_interface_add_notify_participant_updated(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_rtcDataInterface, static_cast<int>(EOS_INVALID_NOTIFICATIONID));\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString room_name = VARIANT_TO_CHARSTRING(p_options->get(\"room_name\"));\n\n    EOS_RTCData_AddNotifyParticipantUpdatedOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_RTCDATA_ADDNOTIFYPARTICIPANTUPDATED_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.RoomName = room_name.get_data();\n\n    return static_cast<int>(EOS_RTCData_AddNotifyParticipantUpdated(s_rtcDataInterface, &options, (void *)*p_options, [](const EOS_RTCData_ParticipantUpdatedCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n        ret[\"room_name\"] = EOSG_GET_STRING(data->RoomName);\n        ret[\"participant_id\"] = eosg_product_user_id_to_string(data->ParticipantId);\n        ret[\"data_status\"] = static_cast<int>(data->DataStatus);\n        IEOS::get_singleton()->emit_signal(\"rtc_data_participant_updated\", ret);\n    }));\n}\n\nint IEOS::rtc_data_interface_send_data(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_rtcDataInterface, static_cast<int>(EOS_INVALID_NOTIFICATIONID));\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString room_name = VARIANT_TO_CHARSTRING(p_options->get(\"room_name\"));\n    PackedByteArray p_data = p_options->get(\"data\");\n\n    EOS_RTCData_SendDataOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_RTCDATA_SENDDATA_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.RoomName = room_name.get_data();\n    options.Data = p_data.ptr();\n    options.DataLengthBytes = p_data.size();\n\n    return static_cast<int>(EOS_RTCData_SendData(s_rtcDataInterface, &options));\n}\n\nvoid IEOS::rtc_data_interface_remove_notify_data_received(int p_notification_id) {\n    ERR_FAIL_NULL(s_rtcDataInterface);\n    EOS_RTCData_RemoveNotifyDataReceived(s_rtcDataInterface, static_cast<EOS_NotificationId>(p_notification_id));\n}\n\nvoid IEOS::rtc_data_interface_remove_notify_participant_updated(int p_notification_id) {\n    ERR_FAIL_NULL(s_rtcDataInterface);\n    EOS_RTCData_RemoveNotifyParticipantUpdated(s_rtcDataInterface, static_cast<EOS_NotificationId>(p_notification_id));\n}\n\nvoid IEOS::rtc_data_interface_update_receiving(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_rtcDataInterface);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString room_name = VARIANT_TO_CHARSTRING(p_options->get(\"room_name\"));\n    CharString participant_id = VARIANT_TO_CHARSTRING(p_options->get(\"participant_id\"));\n    bool data_enabled = p_options->get(\"data_enabled\");\n\n    EOS_RTCData_UpdateReceivingOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_RTCDATA_UPDATERECEIVING_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.RoomName = room_name.get_data();\n    options.ParticipantId = eosg_string_to_product_user_id(participant_id.get_data());\n    options.bDataEnabled = data_enabled ? EOS_TRUE : EOS_FALSE;\n    p_options->reference();\n\n    EOS_RTCData_UpdateReceiving(s_rtcDataInterface, &options, (void *)*p_options, [](const EOS_RTCData_UpdateReceivingCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n        ret[\"room_name\"] = EOSG_GET_STRING(data->RoomName);\n        ret[\"participant_id\"] = eosg_product_user_id_to_string(data->ParticipantId);\n        ret[\"data_enabled\"] = EOSG_GET_BOOL(data->bDataEnabled);\n        IEOS::get_singleton()->emit_signal(\"rtc_data_interface_update_receiving_callback\", ret);\n    });\n}\n\nvoid IEOS::rtc_data_interface_update_sending(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_rtcDataInterface);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString room_name = VARIANT_TO_CHARSTRING(p_options->get(\"room_name\"));\n    bool data_enabled = p_options->get(\"data_enabled\");\n\n    EOS_RTCData_UpdateSendingOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_RTCDATA_UPDATESENDING_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.RoomName = room_name.get_data();\n    options.bDataEnabled = data_enabled ? EOS_TRUE : EOS_FALSE;\n    p_options->reference();\n\n    EOS_RTCData_UpdateSending(s_rtcDataInterface, &options, (void *)*p_options, [](const EOS_RTCData_UpdateSendingCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n        ret[\"room_name\"] = EOSG_GET_STRING(data->RoomName);\n        ret[\"data_enabled\"] = EOSG_GET_BOOL(data->bDataEnabled);\n        IEOS::get_singleton()->emit_signal(\"rtc_data_interface_update_sending_callback\", ret);\n    });\n}"
  },
  {
    "path": "src/rtc_interface.cpp",
    "content": "#include \"ieos.h\"\n\nvoid IEOS::rtc_interface_join_room(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL(s_rtcInterface);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString room_name = VARIANT_TO_CHARSTRING(p_options->get(\"room_name\"));\n    CharString client_base_url = VARIANT_TO_CHARSTRING(p_options->get(\"client_base_url\"));\n    CharString participant_token = VARIANT_TO_CHARSTRING(p_options->get(\"participant_token\"));\n    CharString participant_id = VARIANT_TO_CHARSTRING(p_options->get(\"participant_id\"));\n    int flags = p_options->get(\"flags\");\n    bool manual_audio_input_enabled = p_options->get(\"manual_audio_input_enabled\");\n    bool manual_audio_output_enabled = p_options->get(\"manual_audio_output_enabled\");\n\n    EOS_RTC_JoinRoomOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_RTC_JOINROOM_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.RoomName = room_name.get_data();\n    options.ClientBaseUrl = client_base_url.get_data();\n    options.ParticipantToken = participant_token.get_data();\n    options.ParticipantId = eosg_string_to_product_user_id(participant_id.get_data());\n    options.Flags = static_cast<uint32_t>(flags);\n    options.bManualAudioInputEnabled = manual_audio_input_enabled ? EOS_TRUE : EOS_FALSE;\n    options.bManualAudioOutputEnabled = manual_audio_output_enabled ? EOS_TRUE : EOS_FALSE;\n    p_options->reference();\n\n    EOS_RTC_JoinRoom(s_rtcInterface, &options, (void *)*p_options, [](const EOS_RTC_JoinRoomCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n        ret[\"room_name\"] = EOSG_GET_STRING(data->RoomName);\n        Array room_options = Array();\n        if (data->RoomOptionsCount > 0) {\n            for (int i = 0; i < data->RoomOptionsCount; i++) {\n                Dictionary room_option;\n                room_option[\"key\"] = EOSG_GET_STRING(data->RoomOptions[i].Key);\n                room_option[\"value\"] = EOSG_GET_STRING(data->RoomOptions[i].Value);\n                room_options.append(room_option);\n            }\n        }\n        ret[\"room_options\"] = room_options;\n        IEOS::get_singleton()->emit_signal(\"rtc_interface_join_room_callback\", ret);\n    });\n}\n\nvoid IEOS::rtc_interface_leave_room(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL(s_rtcInterface);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString room_name = VARIANT_TO_CHARSTRING(p_options->get(\"room_name\"));\n\n    EOS_RTC_LeaveRoomOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_RTC_LEAVEROOM_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.RoomName = room_name.get_data();\n    p_options->reference();\n\n    EOS_RTC_LeaveRoom(s_rtcInterface, &options, (void *)*p_options, [](const EOS_RTC_LeaveRoomCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n        ret[\"room_name\"] = EOSG_GET_STRING(data->RoomName);\n        IEOS::get_singleton()->emit_signal(\"rtc_interface_leave_room_callback\", ret);\n    });\n}\n\nvoid IEOS::rtc_interface_block_participant(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL(s_rtcInterface);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString room_name = VARIANT_TO_CHARSTRING(p_options->get(\"room_name\"));\n    CharString participant_id = VARIANT_TO_CHARSTRING(p_options->get(\"participant_id\"));\n    bool blocked = p_options->get(\"blocked\");\n\n    EOS_RTC_BlockParticipantOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_RTC_BLOCKPARTICIPANT_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.RoomName = room_name.get_data();\n    options.ParticipantId = eosg_string_to_product_user_id(participant_id.get_data());\n    options.bBlocked = blocked ? EOS_TRUE : EOS_FALSE;\n    p_options->reference();\n\n    EOS_RTC_BlockParticipant(s_rtcInterface, &options, (void *)*p_options, [](const EOS_RTC_BlockParticipantCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n        ret[\"room_name\"] = EOSG_GET_STRING(data->RoomName);\n        ret[\"participant_id\"] = eosg_product_user_id_to_string(data->ParticipantId);\n        ret[\"blocked\"] = EOSG_GET_BOOL(data->bBlocked);\n        IEOS::get_singleton()->emit_signal(\"rtc_interface_block_participant_callback\", ret);\n    });\n}\n\nint IEOS::rtc_interface_set_setting(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL_V(s_rtcInterface, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    CharString setting_name = VARIANT_TO_CHARSTRING(p_options->get(\"setting_name\"));\n    CharString setting_value = VARIANT_TO_CHARSTRING(p_options->get(\"setting_value\"));\n\n    EOS_RTC_SetSettingOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_RTC_SETSETTING_API_LATEST;\n    options.SettingName = setting_name.get_data();\n    options.SettingValue = setting_value.get_data();\n\n    return static_cast<int>(EOS_RTC_SetSetting(s_rtcInterface, &options));\n}\n\nint IEOS::rtc_interface_set_room_setting(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL_V(s_rtcInterface, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    CharString lcoal_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"lcoal_user_id\"));\n    CharString room_name = VARIANT_TO_CHARSTRING(p_options->get(\"room_name\"));\n    CharString setting_name = VARIANT_TO_CHARSTRING(p_options->get(\"setting_name\"));\n    CharString setting_value = VARIANT_TO_CHARSTRING(p_options->get(\"setting_value\"));\n\n    EOS_RTC_SetRoomSettingOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_RTC_SETROOMSETTING_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(lcoal_user_id.get_data());\n    options.RoomName = room_name.get_data();\n    options.SettingName = setting_name.get_data();\n    options.SettingValue = setting_value.get_data();\n\n    return static_cast<int>(EOS_RTC_SetRoomSetting(s_rtcInterface, &options));\n}\n\nint IEOS::rtc_interface_add_notify_disconnected(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL_V(s_rtcInterface, static_cast<int>(EOS_INVALID_NOTIFICATIONID));\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString room_name = VARIANT_TO_CHARSTRING(p_options->get(\"room_name\"));\n\n    EOS_RTC_AddNotifyDisconnectedOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_RTC_ADDNOTIFYDISCONNECTED_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.RoomName = room_name.get_data();\n\n    return static_cast<int>(EOS_RTC_AddNotifyDisconnected(s_rtcInterface, &options, (void *)*p_options, [](const EOS_RTC_DisconnectedCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n        ret[\"room_name\"] = EOSG_GET_STRING(data->RoomName);\n        IEOS::get_singleton()->emit_signal(\"rtc_interface_disconnected\", ret);\n    }));\n}\n\nint IEOS::rtc_interface_add_notify_participant_status_changed(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL_V(s_rtcInterface, static_cast<int>(EOS_INVALID_NOTIFICATIONID));\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString room_name = VARIANT_TO_CHARSTRING(p_options->get(\"room_name\"));\n\n    EOS_RTC_AddNotifyParticipantStatusChangedOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_RTC_ADDNOTIFYPARTICIPANTSTATUSCHANGED_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.RoomName = room_name.get_data();\n\n    return static_cast<int>(EOS_RTC_AddNotifyParticipantStatusChanged(s_rtcInterface, &options, (void *)*p_options, [](const EOS_RTC_ParticipantStatusChangedCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n        ret[\"room_name\"] = EOSG_GET_STRING(data->RoomName);\n        ret[\"participant_id\"] = eosg_product_user_id_to_string(data->ParticipantId);\n        ret[\"participant_status\"] = static_cast<int>(data->ParticipantStatus);\n        ret[\"participant_in_blocklist\"] = EOSG_GET_BOOL(data->bParticipantInBlocklist);\n\n        Array participant_metadata = Array();\n        if (data->ParticipantMetadataCount > 0) {\n            for (int i = 0; i < data->ParticipantMetadataCount; i++) {\n                Dictionary metadata;\n                metadata[\"key\"] = EOSG_GET_STRING(data->ParticipantMetadata[i].Key);\n                metadata[\"value\"] = EOSG_GET_STRING(data->ParticipantMetadata[i].Value);\n                participant_metadata.append(metadata);\n            }\n        }\n        ret[\"participant_metadata\"] = participant_metadata;\n        IEOS::get_singleton()->emit_signal(\"rtc_interface_participant_status_changed\", ret);\n    }));\n}\n\nint IEOS::rtc_interface_add_notify_room_statistics_updated(Ref<RefCounted> p_options) {\n\tERR_FAIL_NULL_V(s_rtcInterface, static_cast<int>(EOS_INVALID_NOTIFICATIONID));\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString room_name = VARIANT_TO_CHARSTRING(p_options->get(\"room_name\"));\n\n    EOS_RTC_AddNotifyRoomStatisticsUpdatedOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_RTC_ADDNOTIFYROOMSTATISTICSUPDATED_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.RoomName = room_name.get_data();\n\t\n    return static_cast<int>(EOS_RTC_AddNotifyRoomStatisticsUpdated(s_rtcInterface, &options, (void *)*p_options, [](const EOS_RTC_RoomStatisticsUpdatedInfo *data) {\n        Dictionary ret;\n        ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n        ret[\"room_name\"] = EOSG_GET_STRING(data->RoomName);\n        ret[\"statistic\"] = EOSG_GET_STRING(data->Statistic);\n        IEOS::get_singleton()->emit_signal(\"rtc_interface_room_statistics_updated\", ret);\n    }));\n}\n\nvoid IEOS::rtc_interface_remove_notify_disconnected(int p_notification_id) {\n\tERR_FAIL_NULL(s_rtcInterface);\n    EOS_RTC_RemoveNotifyDisconnected(s_rtcInterface, static_cast<EOS_NotificationId>(p_notification_id));\n}\n\nvoid IEOS::rtc_interface_remove_notify_participant_status_changed(int p_notification_id) {\n\tERR_FAIL_NULL(s_rtcInterface);\n    EOS_RTC_RemoveNotifyParticipantStatusChanged(s_rtcInterface, static_cast<EOS_NotificationId>(p_notification_id));\n}\n\nvoid IEOS::rtc_interface_remove_notify_room_statistics_updated(int p_notification_id) {\n\tERR_FAIL_NULL(s_rtcInterface);\n    EOS_RTC_RemoveNotifyRoomStatisticsUpdated(s_rtcInterface, static_cast<EOS_NotificationId>(p_notification_id));\n}"
  },
  {
    "path": "src/sanctions_interface.cpp",
    "content": "#include \"godot_cpp/variant/packed_byte_array.hpp\"\n#include \"ieos.h\"\n\nusing namespace godot;\n\nvoid IEOS::sanctions_interface_query_active_player_sanctions(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_sanctionsInterface);\n    CharString target_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"target_user_id\"));\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n\n    EOS_Sanctions_QueryActivePlayerSanctionsOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_SANCTIONS_QUERYACTIVEPLAYERSANCTIONS_API_LATEST;\n    options.TargetUserId = eosg_string_to_product_user_id(target_user_id.get_data());\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n\n    EOS_Sanctions_QueryActivePlayerSanctions(s_sanctionsInterface, &options, (void *)*p_options, [](const EOS_Sanctions_QueryActivePlayerSanctionsCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n        ret[\"target_user_id\"] = eosg_product_user_id_to_string(data->TargetUserId);\n        IEOS::get_singleton()->emit_signal(\"sanctions_interface_query_active_player_sanctions_callback\", ret);\n    });\n}\n\nint IEOS::sanctions_interface_get_player_sanction_count(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_sanctionsInterface, 0);\n    CharString target_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"target_user_id\"));\n\n    EOS_Sanctions_GetPlayerSanctionCountOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_SANCTIONS_GETPLAYERSANCTIONCOUNT_API_LATEST;\n    options.TargetUserId = eosg_string_to_product_user_id(target_user_id.get_data());\n\n    return static_cast<int>(EOS_Sanctions_GetPlayerSanctionCount(s_sanctionsInterface, &options));\n}\n\nDictionary IEOS::sanctions_interface_copy_player_sanction_by_index(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_sanctionsInterface, {});\n    CharString target_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"target_user_id\"));\n    int sanction_index = p_options->get(\"sanction_index\");\n\n    EOS_Sanctions_CopyPlayerSanctionByIndexOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_SANCTIONS_COPYPLAYERSANCTIONBYINDEX_API_LATEST;\n    options.TargetUserId = eosg_string_to_product_user_id(target_user_id.get_data());\n    options.SanctionIndex = sanction_index;\n\n    EOS_Sanctions_PlayerSanction *outSanction = nullptr;\n    EOS_EResult result = EOS_Sanctions_CopyPlayerSanctionByIndex(s_sanctionsInterface, &options, &outSanction);\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(result);\n    ret[\"sanction\"] = eosg_sanctions_player_sanction_to_dict_and_release(outSanction);\n    return ret;\n}\n\nvoid IEOS::sanctions_interface_create_player_sanction_appeal(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_sanctionsInterface);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString reference_id = VARIANT_TO_CHARSTRING(p_options->get(\"reference_id\"));\n    int reason = p_options->get(\"reason\");\n\n    EOS_Sanctions_CreatePlayerSanctionAppealOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_SANCTIONS_CREATEPLAYERSANCTIONAPPEAL_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.ReferenceId = reference_id.get_data();\n    options.Reason = static_cast<EOS_ESanctionAppealReason>(reason);\n\n    EOS_Sanctions_CreatePlayerSanctionAppeal(s_sanctionsInterface, &options, (void *)*p_options, [](const EOS_Sanctions_CreatePlayerSanctionAppealCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"reference_id\"] = EOSG_GET_STRING(data->ReferenceId);\n        IEOS::get_singleton()->emit_signal(\"sanctions_interface_create_player_sanction_appeal_callback\", ret);\n    });\n}\n"
  },
  {
    "path": "src/sessions_interface.cpp",
    "content": "#include \"ieos.h\"\n\nDictionary IEOS::sessions_interface_copy_active_session_details(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_sessionsInterface, {});\n    CharString session_name = VARIANT_TO_CHARSTRING(p_options->get(\"session_name\"));\n\n    EOS_Sessions_CopyActiveSessionHandleOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_SESSIONS_COPYACTIVESESSIONHANDLE_API_LATEST;\n    options.SessionName = session_name.get_data();\n\n    EOS_HActiveSession outActiveSession = nullptr;\n    EOS_EResult res = EOS_Sessions_CopyActiveSessionHandle(s_sessionsInterface, &options, &outActiveSession);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"active_session\"] = eosg_sessions_active_session_to_wrapper(outActiveSession);\n    return ret;\n}\n\nDictionary IEOS::sessions_interface_copy_session_details_by_invite_id(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_sessionsInterface, {});\n    CharString invite_id = VARIANT_TO_CHARSTRING(p_options->get(\"invite_id\"));\n\n    EOS_Sessions_CopySessionHandleByInviteIdOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_SESSIONS_COPYSESSIONHANDLEBYINVITEID_API_LATEST;\n    options.InviteId = invite_id.get_data();\n\n    EOS_HSessionDetails outSessionHandle = nullptr;\n    EOS_EResult res = EOS_Sessions_CopySessionHandleByInviteId(s_sessionsInterface, &options, &outSessionHandle);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"session_details\"] = eosg_sessions_session_details_to_wrapper(outSessionHandle);\n    return ret;\n}\n\nDictionary IEOS::sessions_interface_copy_session_details_by_ui_event_id(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_sessionsInterface, {});\n    int ui_event_id = p_options->get(\"ui_event_id\");\n\n    EOS_Sessions_CopySessionHandleByUiEventIdOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_SESSIONS_COPYSESSIONHANDLEBYUIEVENTID_API_LATEST;\n    options.UiEventId = static_cast<EOS_UI_EventId>(ui_event_id);\n\n    EOS_HSessionDetails outSessionHandle = nullptr;\n    EOS_EResult res = EOS_Sessions_CopySessionHandleByUiEventId(s_sessionsInterface, &options, &outSessionHandle);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"session_details\"] = eosg_sessions_session_details_to_wrapper(outSessionHandle);\n    return ret;\n}\n\nDictionary IEOS::sessions_interface_copy_session_details_for_presence(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_sessionsInterface, {});\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n\n    EOS_Sessions_CopySessionHandleForPresenceOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_SESSIONS_COPYSESSIONHANDLEFORPRESENCE_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n\n    EOS_HSessionDetails outSessionHandle = nullptr;\n    EOS_EResult res = EOS_Sessions_CopySessionHandleForPresence(s_sessionsInterface, &options, &outSessionHandle);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"session_details\"] = eosg_sessions_session_details_to_wrapper(outSessionHandle);\n    return ret;\n}\n\nDictionary IEOS::sessions_interface_create_session_modification(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_sessionsInterface, {});\n    CharString session_name = VARIANT_TO_CHARSTRING(p_options->get(\"session_name\"));\n    CharString bucket_id = VARIANT_TO_CHARSTRING(p_options->get(\"bucket_id\"));\n    int max_players = p_options->get(\"max_players\");\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    bool presence_enabled = p_options->get(\"presence_enabled\");\n    CharString session_id = VARIANT_TO_CHARSTRING(p_options->get(\"session_id\"));\n    bool sanctions_enabled = p_options->get(\"sanctions_enabled\");\n    Array allowed_platform_ids = p_options->get(\"allowed_platform_ids\");\n\n    EOS_Sessions_CreateSessionModificationOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_SESSIONS_CREATESESSIONMODIFICATION_API_LATEST;\n    options.SessionName = session_name.get_data();\n    options.BucketId = bucket_id.get_data();\n    options.MaxPlayers = static_cast<uint32_t>(max_players);\n    if (local_user_id.length() > 0) {\n        options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    }\n    options.bPresenceEnabled = presence_enabled ? EOS_TRUE : EOS_FALSE;\n    options.SessionId = session_id.get_data();\n    options.bSanctionsEnabled = sanctions_enabled ? EOS_TRUE : EOS_FALSE;\n    options.AllowedPlatformIdsCount = allowed_platform_ids.size();\n    if (allowed_platform_ids.size() > 0) {\n        uint32_t *allowed_platform_ids_array = (uint32_t *)malloc(sizeof(uint32_t) * allowed_platform_ids.size());\n        for (int i = 0; i < allowed_platform_ids.size(); i++) {\n            allowed_platform_ids_array[i] = allowed_platform_ids[i];\n        }\n        options.AllowedPlatformIds = allowed_platform_ids_array;\n    }\n\n    EOS_HSessionModification outSessionModificationHandle = nullptr;\n    EOS_EResult res = EOS_Sessions_CreateSessionModification(s_sessionsInterface, &options, &outSessionModificationHandle);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"session_modification\"] = eosg_sessions_session_modification_to_wrapper(outSessionModificationHandle);\n    return ret;\n}\n\nDictionary IEOS::sessions_interface_create_session_search(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_sessionsInterface, {});\n    int max_search_results = p_options->get(\"max_search_results\");\n\n    EOS_Sessions_CreateSessionSearchOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_SESSIONS_CREATESESSIONSEARCH_API_LATEST;\n    options.MaxSearchResults = static_cast<uint32_t>(max_search_results);\n\n    EOS_HSessionSearch outSessionSearchHandle = nullptr;\n    EOS_EResult res = EOS_Sessions_CreateSessionSearch(s_sessionsInterface, &options, &outSessionSearchHandle);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"session_search\"] = eosg_sessions_session_search_to_wrapper(outSessionSearchHandle);\n    return ret;\n}\n\nint IEOS::sessions_interface_dump_session_state(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_sessionsInterface, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    CharString session_name = VARIANT_TO_CHARSTRING(p_options->get(\"session_name\"));\n\n    EOS_Sessions_DumpSessionStateOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_SESSIONS_DUMPSESSIONSTATE_API_LATEST;\n    options.SessionName = session_name.get_data();\n\n    return static_cast<int>(EOS_Sessions_DumpSessionState(s_sessionsInterface, &options));\n}\n\nDictionary IEOS::sessions_interface_get_invite_id_by_index(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_sessionsInterface, {});\n    int index = p_options->get(\"index\");\n\n    EOS_Sessions_GetInviteIdByIndexOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_SESSIONS_GETINVITEIDBYINDEX_API_LATEST;\n    options.Index = static_cast<uint32_t>(index);\n\n    char *outBuffer = (char *)memalloc(sizeof(char) * (EOS_SESSIONS_INVITEID_MAX_LENGTH + 1));\n    int32_t outBufferLength = 0;\n    EOS_EResult res = EOS_Sessions_GetInviteIdByIndex(s_sessionsInterface, &options, outBuffer, &outBufferLength);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"invite_id\"] = String(outBuffer);\n    return ret;\n}\n\nint IEOS::sessions_interface_is_user_in_session(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_sessionsInterface, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    CharString session_name = VARIANT_TO_CHARSTRING(p_options->get(\"session_name\"));\n    CharString target_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"target_user_id\"));\n\n    EOS_Sessions_IsUserInSessionOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_SESSIONS_ISUSERINSESSION_API_LATEST;\n    options.SessionName = session_name.get_data();\n    options.TargetUserId = eosg_string_to_product_user_id(target_user_id.get_data());\n\n    EOS_EResult res = EOS_Sessions_IsUserInSession(s_sessionsInterface, &options);\n    return static_cast<int>(res);\n}\n\nDictionary IEOS::sessions_interface_update_session_modification(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_sessionsInterface, {});\n    CharString session_name = VARIANT_TO_CHARSTRING(p_options->get(\"session_name\"));\n\n    EOS_Sessions_UpdateSessionModificationOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_SESSIONS_UPDATESESSIONMODIFICATION_API_LATEST;\n    options.SessionName = session_name.get_data();\n\n    EOS_HSessionModification outSessionModificationHandle = nullptr;\n    EOS_EResult res = EOS_Sessions_UpdateSessionModification(s_sessionsInterface, &options, &outSessionModificationHandle);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"session_modification\"] = eosg_sessions_session_modification_to_wrapper(outSessionModificationHandle);\n    return ret;\n}\n\nint IEOS::sessions_interface_get_invite_count(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_sessionsInterface, 0);\n    EOS_Sessions_GetInviteCountOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_SESSIONS_GETINVITECOUNT_API_LATEST;\n\n    return static_cast<int>(EOS_Sessions_GetInviteCount(s_sessionsInterface, &options));\n}\n\nvoid IEOS::sessions_interface_destroy_session(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_sessionsInterface);\n    CharString session_name = VARIANT_TO_CHARSTRING(p_options->get(\"session_name\"));\n\n    EOS_Sessions_DestroySessionOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_SESSIONS_DESTROYSESSION_API_LATEST;\n    options.SessionName = session_name.get_data();\n    p_options->reference();\n\n    EOS_Sessions_DestroySession(s_sessionsInterface, &options, (void *)*p_options, [](const EOS_Sessions_DestroySessionCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        IEOS::get_singleton()->emit_signal(\"sessions_interface_destroy_session_callback\", ret);\n    });\n}\n\nvoid IEOS::sessions_interface_end_session(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_sessionsInterface);\n    CharString session_name = VARIANT_TO_CHARSTRING(p_options->get(\"session_name\"));\n\n    EOS_Sessions_EndSessionOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_SESSIONS_ENDSESSION_API_LATEST;\n    options.SessionName = session_name.get_data();\n    p_options->reference();\n\n    EOS_Sessions_EndSession(s_sessionsInterface, &options, (void *)*p_options, [](const EOS_Sessions_EndSessionCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        IEOS::get_singleton()->emit_signal(\"sessions_interface_end_session_callback\", ret);\n    });\n}\n\nvoid IEOS::sessions_interface_join_session(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_sessionsInterface);\n    Ref<EOSGSessionDetails> session_details = Object::cast_to<EOSGSessionDetails>(p_options->get(\"session_details\"));\n    ERR_FAIL_NULL_MSG(session_details, \"Error joining session. JoinSessionOptions.session_details is null.\");\n    ERR_FAIL_NULL_MSG(session_details->get_internal(), \"Error joining session. EOSGSessionDetails is null.\");\n\n    CharString session_name = VARIANT_TO_CHARSTRING(p_options->get(\"session_name\"));\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    bool presence_enabled = p_options->get(\"presence_enabled\");\n\n    EOS_Sessions_JoinSessionOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_SESSIONS_JOINSESSION_API_LATEST;\n    options.SessionName = session_name.get_data();\n    options.SessionHandle = session_details->get_internal();\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.bPresenceEnabled = presence_enabled ? EOS_TRUE : EOS_FALSE;\n    p_options->reference();\n\n    EOS_Sessions_JoinSession(s_sessionsInterface, &options, (void *)*p_options, [](const EOS_Sessions_JoinSessionCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        IEOS::get_singleton()->emit_signal(\"sessions_interface_join_session_callback\", ret);\n    });\n}\n\nvoid IEOS::sessions_interface_query_invites(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_sessionsInterface);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n\n    EOS_Sessions_QueryInvitesOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_SESSIONS_QUERYINVITES_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    p_options->reference();\n\n    EOS_Sessions_QueryInvites(s_sessionsInterface, &options, (void *)*p_options, [](const EOS_Sessions_QueryInvitesCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n        IEOS::get_singleton()->emit_signal(\"sessions_interface_query_invites_callback\", ret);\n    });\n}\n\nvoid IEOS::sessions_interface_register_players(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_sessionsInterface);\n    CharString session_name = VARIANT_TO_CHARSTRING(p_options->get(\"session_name\"));\n    TypedArray<String> players_to_register = p_options->get(\"players_to_register\");\n\n    EOS_Sessions_RegisterPlayersOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_SESSIONS_REGISTERPLAYERS_API_LATEST;\n    options.SessionName = session_name.get_data();\n    options.PlayersToRegisterCount = players_to_register.size();\n    EOS_ProductUserId *players_to_register_array = (EOS_ProductUserId *)malloc(sizeof(EOS_ProductUserId) * players_to_register.size());\n    for (int i = 0; i < players_to_register.size(); i++) {\n        players_to_register_array[i] = eosg_string_to_product_user_id(VARIANT_TO_CHARSTRING(players_to_register[i]).get_data());\n    }\n    options.PlayersToRegister = players_to_register_array;\n    p_options->reference();\n\n    EOS_Sessions_RegisterPlayers(s_sessionsInterface, &options, (void *)*p_options, [](const EOS_Sessions_RegisterPlayersCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n\n        Array registered_players_array = Array();\n        for (int i = 0; i < data->RegisteredPlayersCount; i++) {\n            registered_players_array.append(eosg_product_user_id_to_string(data->RegisteredPlayers[i]));\n        }\n        ret[\"registered_players\"] = registered_players_array;\n\n        Array sanctioned_players_array = Array();\n        for (int i = 0; i < data->SanctionedPlayersCount; i++) {\n            sanctioned_players_array.append(eosg_product_user_id_to_string(data->SanctionedPlayers[i]));\n        }\n        ret[\"sanctioned_players\"] = sanctioned_players_array;\n\n        IEOS::get_singleton()->emit_signal(\"sessions_interface_register_players_callback\", ret);\n    });\n}\n\nvoid IEOS::sessions_interface_reject_invite(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_sessionsInterface);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString invite_id = VARIANT_TO_CHARSTRING(p_options->get(\"invite_id\"));\n\n    EOS_Sessions_RejectInviteOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_SESSIONS_REJECTINVITE_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.InviteId = invite_id.get_data();\n    p_options->reference();\n\n    EOS_Sessions_RejectInvite(s_sessionsInterface, &options, (void *)*p_options, [](const EOS_Sessions_RejectInviteCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        IEOS::get_singleton()->emit_signal(\"sessions_interface_reject_invite_callback\", ret);\n    });\n}\n\nvoid IEOS::sessions_interface_send_invite(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_sessionsInterface);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString target_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"target_user_id\"));\n    CharString session_name = VARIANT_TO_CHARSTRING(p_options->get(\"session_name\"));\n\n    EOS_Sessions_SendInviteOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_SESSIONS_SENDINVITE_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.TargetUserId = eosg_string_to_product_user_id(target_user_id.get_data());\n    options.SessionName = session_name.get_data();\n    p_options->reference();\n\n    EOS_Sessions_SendInvite(s_sessionsInterface, &options, (void *)*p_options, [](const EOS_Sessions_SendInviteCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        IEOS::get_singleton()->emit_signal(\"sessions_interface_send_invite_callback\", ret);\n    });\n}\n\nvoid IEOS::sessions_interface_start_session(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_sessionsInterface);\n    CharString session_name = VARIANT_TO_CHARSTRING(p_options->get(\"session_name\"));\n\n    EOS_Sessions_StartSessionOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_SESSIONS_STARTSESSION_API_LATEST;\n    options.SessionName = session_name.get_data();\n    p_options->reference();\n\n    EOS_Sessions_StartSession(s_sessionsInterface, &options, (void *)*p_options, [](const EOS_Sessions_StartSessionCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        IEOS::get_singleton()->emit_signal(\"sessions_interface_start_session_callback\", ret);\n    });\n}\n\nvoid IEOS::sessions_interface_unregister_players(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_sessionsInterface);\n    CharString session_name = VARIANT_TO_CHARSTRING(p_options->get(\"session_name\"));\n    TypedArray<String> players_to_unregister = p_options->get(\"players_to_unregister\");\n\n    EOS_Sessions_UnregisterPlayersOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_SESSIONS_UNREGISTERPLAYERS_API_LATEST;\n    options.SessionName = session_name.get_data();\n    options.PlayersToUnregisterCount = players_to_unregister.size();\n    EOS_ProductUserId *players_to_unregister_array = (EOS_ProductUserId *)malloc(sizeof(EOS_ProductUserId) * players_to_unregister.size());\n    for (int i = 0; i < players_to_unregister.size(); i++) {\n        players_to_unregister_array[i] = eosg_string_to_product_user_id(VARIANT_TO_CHARSTRING(players_to_unregister[i]).get_data());\n    }\n    options.PlayersToUnregister = players_to_unregister_array;\n    p_options->reference();\n\n    EOS_Sessions_UnregisterPlayers(s_sessionsInterface, &options, (void *)*p_options, [](const EOS_Sessions_UnregisterPlayersCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        Array unregistered_players_array = Array();\n        for (int i = 0; i < data->UnregisteredPlayersCount; i++) {\n            unregistered_players_array.append(eosg_product_user_id_to_string(data->UnregisteredPlayers[i]));\n        }\n        ret[\"unregistered_players\"] = unregistered_players_array;\n\n        IEOS::get_singleton()->emit_signal(\"sessions_interface_unregister_players_callback\", ret);\n    });\n}\n\nvoid IEOS::sessions_interface_update_session(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_sessionsInterface);\n    Ref<EOSGSessionModification> session_modification = Object::cast_to<EOSGSessionModification>(p_options->get(\"session_modification\"));\n    ERR_FAIL_NULL_MSG(session_modification, \"Error updating session. UpdateSessionOptions.session_modification is null.\");\n    ERR_FAIL_NULL_MSG(session_modification->get_internal(), \"Error updating session. EOSGSessionModification is null.\");\n\n    EOS_Sessions_UpdateSessionOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_SESSIONS_UPDATESESSION_API_LATEST;\n    options.SessionModificationHandle = session_modification->get_internal();\n    p_options->reference();\n\n    EOS_Sessions_UpdateSession(s_sessionsInterface, &options, (void *)*p_options, [](const EOS_Sessions_UpdateSessionCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"session_name\"] = EOSG_GET_STRING(data->SessionName);\n        ret[\"session_id\"] = EOSG_GET_STRING(data->SessionId);\n        IEOS::get_singleton()->emit_signal(\"sessions_interface_update_session_callback\", ret);\n    });\n}\n"
  },
  {
    "path": "src/stats_interface.cpp",
    "content": "#include \"ieos.h\"\nusing namespace std;\n\nDictionary IEOS::stats_interface_copy_stat_by_index(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_statsInterface, {});\n    CharString target_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"target_user_id\"));\n\n    EOS_Stats_CopyStatByIndexOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_STATS_COPYSTATBYINDEX_API_LATEST;\n    options.TargetUserId = eosg_string_to_product_user_id(target_user_id.get_data());\n    options.StatIndex = static_cast<uint32_t>(static_cast<int>(p_options->get(\"stat_index\")));\n\n    EOS_Stats_Stat *outStat = nullptr;\n    EOS_EResult res = EOS_Stats_CopyStatByIndex(s_statsInterface, &options, &outStat);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"stat\"] = eosg_stats_stat_to_dict_and_release(outStat);\n    return ret;\n}\n\nDictionary IEOS::stats_interface_copy_stat_by_name(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_statsInterface, {});\n    CharString target_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"target_user_id\"));\n    CharString name = VARIANT_TO_CHARSTRING(p_options->get(\"name\"));\n\n    EOS_Stats_CopyStatByNameOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_STATS_COPYSTATBYNAME_API_LATEST;\n    options.TargetUserId = eosg_string_to_product_user_id(target_user_id.get_data());\n    options.Name = name.get_data();\n\n    EOS_Stats_Stat *outStat = nullptr;\n    EOS_EResult res = EOS_Stats_CopyStatByName(s_statsInterface, &options, &outStat);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"stat\"] = eosg_stats_stat_to_dict_and_release(outStat);\n    return ret;\n}\n\nint IEOS::stats_interface_get_stats_count(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_statsInterface, 0);\n    CharString target_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"target_user_id\"));\n\n    EOS_Stats_GetStatCountOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_STATS_GETSTATSCOUNT_API_LATEST;\n    options.TargetUserId = eosg_string_to_product_user_id(target_user_id.get_data());\n\n    return static_cast<int>(EOS_Stats_GetStatsCount(s_statsInterface, &options));\n}\n\nvoid IEOS::stats_interface_ingest_stat(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_statsInterface);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString target_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"target_user_id\"));\n    Array p_stats = p_options->get(\"stats\");\n    int stats_count = p_stats.size();\n\n    EOS_Stats_IngestData *stats = (EOS_Stats_IngestData *)memalloc(sizeof(EOS_Stats_IngestData) * stats_count);\n    PERSISTENT_CHAR_ARRAY_CREATE(stat_names, stat_names_charstrings, stats_count)\n    for (int i = 0; i < stats_count; i++) {\n        Dictionary p_stat = p_stats[i];\n        PERSISTENT_CHAR_ARRAY_SET(stat_names, stat_names_charstrings, i, p_stat[\"stat_name\"]);\n        stats[i].ApiVersion = EOS_STATS_INGESTDATA_API_LATEST;\n        stats[i].StatName = stat_names[i];\n        stats[i].IngestAmount = static_cast<int32_t>(static_cast<int>(p_stat[\"ingest_amount\"]));\n    }\n\n    EOS_Stats_IngestStatOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_STATS_INGESTSTAT_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.TargetUserId = eosg_string_to_product_user_id(target_user_id.get_data());\n    options.StatsCount = stats_count;\n    options.Stats = stats;\n    p_options->reference();\n\n    EOS_Stats_IngestStat(s_statsInterface, &options, (void *)*p_options, [](const EOS_Stats_IngestStatCompleteCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n        ret[\"target_user_id\"] = eosg_product_user_id_to_string(data->TargetUserId);\n        IEOS::get_singleton()->emit_signal(\"stats_interface_ingest_stat_callback\", ret);\n    });\n}\n\nvoid IEOS::stats_interface_query_stats(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_statsInterface);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString target_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"target_user_id\"));\n    Array p_stat_names = p_options->get(\"stat_names\");\n    int stat_names_count = p_stat_names.size();\n\n    const char **stat_names = (const char **)memalloc(sizeof(const char *) * stat_names_count);\n\tPERSISTENT_CHAR_ARRAY_CREATE(stat_names_cstr, stat_names_cstr_charstrings, stat_names_count)\n    for (int i = 0; i < stat_names_count; i++) {\n\t\tPERSISTENT_CHAR_ARRAY_SET(stat_names_cstr, stat_names_cstr_charstrings, i, p_stat_names[i]);\n        stat_names[i] = stat_names_cstr[i];\n    }\n\n    EOS_Stats_QueryStatsOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_STATS_QUERYSTATS_API_LATEST;\n    if (local_user_id.length() > 0) {\n        options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    }\n    options.TargetUserId = eosg_string_to_product_user_id(target_user_id.get_data());\n    if (stat_names_count > 0) {\n        options.StatNamesCount = stat_names_count;\n        options.StatNames = stat_names;\n    }\n    options.StartTime = static_cast<int64_t>(p_options->get(\"start_time\"));\n    options.EndTime = static_cast<int64_t>(p_options->get(\"end_time\"));\n    p_options->reference();\n\n    EOS_Stats_QueryStats(s_statsInterface, &options, (void *)*p_options, [](const EOS_Stats_OnQueryStatsCompleteCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n        ret[\"target_user_id\"] = eosg_product_user_id_to_string(data->TargetUserId);\n        IEOS::get_singleton()->emit_signal(\"stats_interface_query_stats_callback\", ret);\n    });\n}\n"
  },
  {
    "path": "src/titlestorage_interface.cpp",
    "content": "#include \"godot_cpp/variant/packed_byte_array.hpp\"\n#include \"ieos.h\"\n\nusing namespace godot;\n\nvoid IEOS::titlestorage_interface_query_file(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_titleStorageInterface);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString filename = VARIANT_TO_CHARSTRING(p_options->get(\"filename\"));\n\n    EOS_TitleStorage_QueryFileOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_TITLESTORAGE_QUERYFILE_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.Filename = filename.get_data();\n    p_options->reference();\n\n    EOS_TitleStorage_QueryFile(s_titleStorageInterface, &options, (void *)*p_options, [](const EOS_TitleStorage_QueryFileCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n        IEOS::get_singleton()->emit_signal(\"titlestorage_interface_query_file_callback\", ret);\n    });\n}\n\nvoid IEOS::titlestorage_interface_query_file_list(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_titleStorageInterface);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    Array list_of_tags = p_options->get(\"list_of_tags\");\n\n    ERR_FAIL_COND_MSG(list_of_tags.size() == 0, \"TitleStorage.QueryFileListOptions.list_of_tags must not be empty.\");\n\n    EOS_TitleStorage_QueryFileListOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_TITLESTORAGE_QUERYFILELIST_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.ListOfTagsCount = static_cast<uint32_t>(list_of_tags.size());\n    const char **listOfTags = (const char **)memalloc(sizeof(const char *) * options.ListOfTagsCount);\n    for (int i = 0; i < options.ListOfTagsCount; i++) {\n        listOfTags[i] = VARIANT_TO_CHARSTRING(list_of_tags[i]).get_data();\n    }\n    options.ListOfTags = listOfTags;\n    p_options->reference();\n\n    EOS_TitleStorage_QueryFileList(s_titleStorageInterface, &options, (void *)*p_options, [](const EOS_TitleStorage_QueryFileListCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n        ret[\"file_count\"] = static_cast<int>(data->FileCount);\n        IEOS::get_singleton()->emit_signal(\"titlestorage_interface_query_file_list_callback\", ret);\n    });\n}\n\nDictionary IEOS::titlestorage_interface_copy_file_metadata_by_filename(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_titleStorageInterface, {});\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString filename = VARIANT_TO_CHARSTRING(p_options->get(\"filename\"));\n\n    EOS_TitleStorage_CopyFileMetadataByFilenameOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_TITLESTORAGE_COPYFILEMETADATABYFILENAME_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.Filename = filename.get_data();\n\n    EOS_TitleStorage_FileMetadata *outMetadata = nullptr;\n    EOS_EResult res = EOS_TitleStorage_CopyFileMetadataByFilename(s_titleStorageInterface, &options, &outMetadata);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"metadata\"] = eosg_titlestorage_file_metadata_to_dict_and_release(outMetadata);\n    return ret;\n}\n\nint IEOS::titlestorage_interface_get_file_metadata_count(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_titleStorageInterface, 0);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n\n    EOS_TitleStorage_GetFileMetadataCountOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_TITLESTORAGE_GETFILEMETADATACOUNT_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n\n    return static_cast<uint32_t>(EOS_TitleStorage_GetFileMetadataCount(s_titleStorageInterface, &options));\n}\n\nDictionary IEOS::titlestorage_interface_copy_file_metadata_at_index(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_titleStorageInterface, {});\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    int index = p_options->get(\"index\");\n\n    EOS_TitleStorage_CopyFileMetadataAtIndexOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_TITLESTORAGE_COPYFILEMETADATAATINDEX_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.Index = static_cast<uint32_t>(index);\n\n    EOS_TitleStorage_FileMetadata *outMetadata = nullptr;\n    EOS_EResult res = EOS_TitleStorage_CopyFileMetadataAtIndex(s_titleStorageInterface, &options, &outMetadata);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"metadata\"] = eosg_titlestorage_file_metadata_to_dict_and_release(outMetadata);\n    return ret;\n}\n\nint IEOS::titlestorage_interface_delete_cache(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_titleStorageInterface, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n\n    EOS_TitleStorage_DeleteCacheOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_TITLESTORAGE_DELETECACHE_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    p_options->reference();\n\n    EOS_EResult res = EOS_TitleStorage_DeleteCache(s_titleStorageInterface, &options, (void *)*p_options, [](const EOS_TitleStorage_DeleteCacheCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n        IEOS::get_singleton()->emit_signal(\"titlestorage_interface_delete_cache_callback\", ret);\n    });\n\n    return static_cast<int>(res);\n}\n\nVariant IEOS::titlestorage_interface_read_file(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_titleStorageInterface, Variant());\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString filename = VARIANT_TO_CHARSTRING(p_options->get(\"filename\"));\n    int read_chunk_length_bytes = p_options->get(\"read_chunk_length_bytes\");\n\n    EOS_TitleStorage_ReadFileOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_TITLESTORAGE_READFILE_API_LATEST;\n    options.LocalUserId = eosg_string_to_product_user_id(local_user_id.get_data());\n    options.Filename = filename.get_data();\n    options.ReadChunkLengthBytes = static_cast<uint32_t>(read_chunk_length_bytes);\n    options.ReadFileDataCallback = [](const EOS_TitleStorage_ReadFileDataCallbackInfo *data) {\n        Dictionary ret;\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n        ret[\"filename\"] = data->Filename;\n        ret[\"total_file_size_bytes\"] = static_cast<int>(data->TotalFileSizeBytes);\n        ret[\"is_last_chunk\"] = EOSG_GET_BOOL(data->bIsLastChunk);\n        ret[\"data_chunk_length_bytes\"] = static_cast<int>(data->DataChunkLengthBytes);\n\n        // Copy data into a PackedByteArray\n        PackedByteArray data_chunk;\n        data_chunk.resize(data->DataChunkLengthBytes);\n        memcpy(data_chunk.ptrw(), data->DataChunk, data->DataChunkLengthBytes);\n        ret[\"data_chunk\"] = data_chunk;\n\n        IEOS::get_singleton()->emit_signal(\"titlestorage_interface_read_file_data_callback\", ret);\n        // TODO: emit the signal on the EOSGFileTransferRequest object instead of IEOS\n        return EOS_TitleStorage_EReadResult::EOS_TS_RR_ContinueReading;\n    };\n    options.FileTransferProgressCallback = [](const EOS_TitleStorage_FileTransferProgressCallbackInfo *data) {\n        Dictionary ret;\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n        ret[\"filename\"] = data->Filename;\n        ret[\"bytes_transferred\"] = static_cast<int>(data->BytesTransferred);\n        ret[\"total_file_size_bytes\"] = static_cast<int>(data->TotalFileSizeBytes);\n        IEOS::get_singleton()->emit_signal(\"titlestorage_interface_file_transfer_progress_callback\", ret);\n        // TODO: emit the signal on the EOSGFileTransferRequest object instead of IEOS\n    };\n    p_options->reference();\n\n    EOS_HTitleStorageFileTransferRequest fileTranferRequest = EOS_TitleStorage_ReadFile(s_titleStorageInterface, &options, (void *)*p_options, [](const EOS_TitleStorage_ReadFileCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"local_user_id\"] = eosg_product_user_id_to_string(data->LocalUserId);\n        ret[\"filename\"] = data->Filename;\n        IEOS::get_singleton()->emit_signal(\"titlestorage_interface_read_file_callback\", ret);\n    });\n\n    return eosg_titlestorage_file_tranfer_request_to_wrapper(fileTranferRequest);\n}\n"
  },
  {
    "path": "src/ui_interface.cpp",
    "content": "#include \"ieos.h\"\nusing namespace godot;\n\nint IEOS::ui_interface_acknowledge_event_id(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_uiInterface, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    EOS_UI_AcknowledgeEventIdOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_UI_ACKNOWLEDGEEVENTID_API_LATEST;\n    options.UiEventId = static_cast<EOS_UI_EventId>(p_options->get(\"ui_event_id\"));\n    options.Result = static_cast<EOS_EResult>(static_cast<int>(p_options->get(\"result\")));\n\n    return static_cast<int>(EOS_UI_AcknowledgeEventId(s_uiInterface, &options));\n}\n\nbool IEOS::ui_interface_get_friends_visible(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_uiInterface, false);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n\n    EOS_UI_GetFriendsVisibleOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_UI_GETFRIENDSVISIBLE_API_LATEST;\n    options.LocalUserId = eosg_string_to_epic_account_id(local_user_id.get_data());\n\n    return EOSG_GET_BOOL(EOS_UI_GetFriendsVisible(s_uiInterface, &options));\n}\n\nint IEOS::ui_interface_get_notification_location_preference() {\n    ERR_FAIL_NULL_V(s_uiInterface, static_cast<int>(EOS_UI_ENotificationLocation::EOS_UNL_TopLeft));\n    return static_cast<int>(EOS_UI_GetNotificationLocationPreference(s_uiInterface));\n}\n\nint IEOS::ui_interface_get_toggle_friends_key(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_uiInterface, static_cast<int>(EOS_UI_EKeyCombination::EOS_UIK_Shift | EOS_UI_EKeyCombination::EOS_UIK_F3));\n    EOS_UI_GetToggleFriendsKeyOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_UI_GETTOGGLEFRIENDSKEY_API_LATEST;\n\n    return static_cast<int>(EOS_UI_GetToggleFriendsKey(s_uiInterface, &options));\n}\n\nvoid IEOS::ui_interface_hide_friends(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_uiInterface);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n\n    EOS_UI_HideFriendsOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_UI_HIDEFRIENDS_API_LATEST;\n    options.LocalUserId = eosg_string_to_epic_account_id(local_user_id.get_data());\n    p_options->reference();\n\n    EOS_UI_HideFriends(s_uiInterface, &options, (void *)*p_options, [](const EOS_UI_HideFriendsCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"local_user_id\"] = eosg_epic_account_id_to_string(data->LocalUserId);\n        IEOS::get_singleton()->emit_signal(\"ui_interface_hide_friends_callback\", ret);\n    });\n}\n\nbool IEOS::ui_interface_is_valid_key_combination(int key_combination) {\n    ERR_FAIL_NULL_V(s_uiInterface, false);\n    return EOSG_GET_BOOL(EOS_UI_IsValidKeyCombination(s_uiInterface, static_cast<EOS_UI_EKeyCombination>(key_combination)));\n}\n\nint IEOS::ui_interface_set_display_preference(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_uiInterface, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    EOS_UI_SetDisplayPreferenceOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_UI_SETDISPLAYPREFERENCE_API_LATEST;\n    options.NotificationLocation = static_cast<EOS_UI_ENotificationLocation>(static_cast<int>(p_options->get(\"notification_location\")));\n\n    return static_cast<int>(EOS_UI_SetDisplayPreference(s_uiInterface, &options));\n}\n\nint IEOS::ui_interface_set_toggle_friends_key(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_uiInterface, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    EOS_UI_SetToggleFriendsKeyOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_UI_SETTOGGLEFRIENDSKEY_API_LATEST;\n    options.KeyCombination = static_cast<EOS_UI_EKeyCombination>(static_cast<int>(p_options->get(\"key_combination\")));\n\n    return static_cast<int>(EOS_UI_SetToggleFriendsKey(s_uiInterface, &options));\n}\n\nvoid IEOS::ui_interface_show_friends(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_uiInterface);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n\n    EOS_UI_ShowFriendsOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_UI_SHOWFRIENDS_API_LATEST;\n    options.LocalUserId = eosg_string_to_epic_account_id(local_user_id.get_data());\n    p_options->reference();\n\n    EOS_UI_ShowFriends(s_uiInterface, &options, (void *)*p_options, [](const EOS_UI_ShowFriendsCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"local_user_id\"] = eosg_epic_account_id_to_string(data->LocalUserId);\n        IEOS::get_singleton()->emit_signal(\"ui_interface_show_friends_callback\", ret);\n    });\n}\n\nbool IEOS::ui_interface_get_friends_exclusive_input(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_uiInterface, false);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n\n    EOS_UI_GetFriendsExclusiveInputOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_UI_GETFRIENDSEXCLUSIVEINPUT_API_LATEST;\n    options.LocalUserId = eosg_string_to_epic_account_id(local_user_id.get_data());\n\n    return EOSG_GET_BOOL(EOS_UI_GetFriendsExclusiveInput(s_uiInterface, &options));\n}\n\nvoid IEOS::ui_interface_show_block_player(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_uiInterface);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString target_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"target_user_id\"));\n\n    EOS_UI_ShowBlockPlayerOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_UI_SHOWBLOCKPLAYER_API_LATEST;\n    options.LocalUserId = eosg_string_to_epic_account_id(local_user_id.get_data());\n    options.TargetUserId = eosg_string_to_epic_account_id(target_user_id.get_data());\n    p_options->reference();\n\n    EOS_UI_ShowBlockPlayer(s_uiInterface, &options, (void *)*p_options, [](const EOS_UI_OnShowBlockPlayerCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"local_user_id\"] = eosg_epic_account_id_to_string(data->LocalUserId);\n        ret[\"target_user_id\"] = eosg_epic_account_id_to_string(data->TargetUserId);\n        IEOS::get_singleton()->emit_signal(\"ui_interface_show_block_player_callback\", ret);\n    });\n}\n\nvoid IEOS::ui_interface_show_report_player(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_uiInterface);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString target_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"target_user_id\"));\n\n    EOS_UI_ShowReportPlayerOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_UI_SHOWREPORTPLAYER_API_LATEST;\n    options.LocalUserId = eosg_string_to_epic_account_id(local_user_id.get_data());\n    options.TargetUserId = eosg_string_to_epic_account_id(target_user_id.get_data());\n    p_options->reference();\n\n    EOS_UI_ShowReportPlayer(s_uiInterface, &options, (void *)*p_options, [](const EOS_UI_OnShowReportPlayerCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"local_user_id\"] = eosg_epic_account_id_to_string(data->LocalUserId);\n        ret[\"target_user_id\"] = eosg_epic_account_id_to_string(data->TargetUserId);\n        IEOS::get_singleton()->emit_signal(\"ui_interface_show_report_player_callback\", ret);\n    });\n}\n\nint IEOS::ui_interface_pause_social_overlay(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_uiInterface, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    EOS_UI_PauseSocialOverlayOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_UI_PAUSESOCIALOVERLAY_API_LATEST;\n    options.bIsPaused = VARIANT_TO_EOS_BOOL(p_options->get(\"is_paused\"));\n\n    return static_cast<int>(EOS_UI_PauseSocialOverlay(s_uiInterface, &options));\n}\n\nbool IEOS::ui_interface_is_social_overlay_paused(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_uiInterface, false);\n    EOS_UI_IsSocialOverlayPausedOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_UI_ISSOCIALOVERLAYPAUSED_API_LATEST;\n\n    return EOSG_GET_BOOL(EOS_UI_IsSocialOverlayPaused(s_uiInterface, &options));\n}\n\nint IEOS::ui_interface_set_toggle_friends_button(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_uiInterface, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    int button_combination = p_options->get(\"button_combination\");\n\n    EOS_UI_SetToggleFriendsButtonOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_UI_SETTOGGLEFRIENDSBUTTON_API_LATEST;\n    options.ButtonCombination = static_cast<EOS_UI_EInputStateButtonFlags>(button_combination);\n\n    return static_cast<int>(EOS_UI_SetToggleFriendsButton(s_uiInterface, &options));\n}\n\nint IEOS::ui_interface_get_toggle_friends_button(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_uiInterface, static_cast<int>(EOS_UI_EInputStateButtonFlags::EOS_UISBF_None));\n    EOS_UI_GetToggleFriendsButtonOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_UI_GETTOGGLEFRIENDSBUTTON_API_LATEST;\n\n    return static_cast<int>(EOS_UI_GetToggleFriendsButton(s_uiInterface, &options));\n}\n\nbool IEOS::ui_interface_is_valid_button_combination(int p_button_combination) {\n    ERR_FAIL_NULL_V(s_uiInterface, false);\n    return EOSG_GET_BOOL(EOS_UI_IsValidButtonCombination(s_uiInterface, static_cast<EOS_UI_EInputStateButtonFlags>(p_button_combination)));\n}\n\nint IEOS::ui_interface_report_input_state(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_uiInterface, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    int button_down_flags = p_options->get(\"button_down_flags\");\n    int mouse_pos_x = p_options->get(\"mouse_pos_x\");\n    int mouse_pos_y = p_options->get(\"mouse_pos_y\");\n    int gamepad_index = p_options->get(\"gamepad_index\");\n    float left_stick_x = p_options->get(\"left_stick_x\");\n    float left_stick_y = p_options->get(\"left_stick_y\");\n    float right_stick_x = p_options->get(\"right_stick_x\");\n    float right_stick_y = p_options->get(\"right_stick_y\");\n    float left_trigger = p_options->get(\"left_trigger\");\n    float right_trigger = p_options->get(\"right_trigger\");\n\n    EOS_UI_ReportInputStateOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_UI_REPORTINPUTSTATE_API_LATEST;\n    options.ButtonDownFlags = static_cast<EOS_UI_EInputStateButtonFlags>(button_down_flags);\n    options.bAcceptIsFaceButtonRight = VARIANT_TO_EOS_BOOL(p_options->get(\"accept_is_face_button_right\"));\n    options.bMouseButtonDown = VARIANT_TO_EOS_BOOL(p_options->get(\"mouse_button_down\"));\n    options.MousePosX = static_cast<uint32_t>(mouse_pos_x);\n    options.MousePosY = static_cast<uint32_t>(mouse_pos_y);\n    options.GamepadIndex = static_cast<uint32_t>(gamepad_index);\n    options.LeftStickX = left_stick_x;\n    options.LeftStickY = left_stick_y;\n    options.RightStickX = right_stick_x;\n    options.RightStickY = right_stick_y;\n    options.LeftTrigger = left_trigger;\n    options.RightTrigger = right_trigger;\n\n    return static_cast<int>(EOS_UI_ReportInputState(s_uiInterface, &options));\n}\n\nint IEOS::ui_interface_pre_present(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_uiInterface, static_cast<int>(EOS_EResult::EOS_InvalidState));\n    EOS_UI_PrePresentOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_UI_PREPRESENT_API_LATEST;\n\n    return static_cast<int>(EOS_UI_PrePresent(s_uiInterface, &options));\n}\n\nvoid IEOS::ui_interface_show_native_profile(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_uiInterface);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString target_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"target_user_id\"));\n\n    EOS_UI_ShowNativeProfileOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_UI_SHOWNATIVEPROFILE_API_LATEST;\n    options.LocalUserId = eosg_string_to_epic_account_id(local_user_id.get_data());\n    options.TargetUserId = eosg_string_to_epic_account_id(target_user_id.get_data());\n    p_options->reference();\n\n    EOS_UI_ShowNativeProfile(s_uiInterface, &options, (void *)*p_options, [](const EOS_UI_ShowNativeProfileCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"local_user_id\"] = eosg_epic_account_id_to_string(data->LocalUserId);\n        ret[\"target_user_id\"] = eosg_epic_account_id_to_string(data->TargetUserId);\n        IEOS::get_singleton()->emit_signal(\"ui_interface_show_native_profile_callback\", ret);\n    });\n}"
  },
  {
    "path": "src/user_info_interface.cpp",
    "content": "#include \"ieos.h\"\nusing namespace std;\n\nDictionary IEOS::user_info_interface_copy_external_user_info_by_account_id(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_userInfoInterface, {});\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString target_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"target_user_id\"));\n    CharString account_id = VARIANT_TO_CHARSTRING(p_options->get(\"account_id\"));\n\n    EOS_UserInfo_CopyExternalUserInfoByAccountIdOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_USERINFO_COPYEXTERNALUSERINFOBYACCOUNTID_API_LATEST;\n    options.LocalUserId = eosg_string_to_epic_account_id(local_user_id.get_data());\n    options.TargetUserId = eosg_string_to_epic_account_id(target_user_id.get_data());\n    options.AccountId = account_id.get_data();\n\n    EOS_UserInfo_ExternalUserInfo *outExternalUserInfo = nullptr;\n    EOS_EResult res = EOS_UserInfo_CopyExternalUserInfoByAccountId(s_userInfoInterface, &options, &outExternalUserInfo);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"external_user_info\"] = eosg_user_info_external_user_info_to_dict_and_release(outExternalUserInfo);\n    return ret;\n}\n\nDictionary IEOS::user_info_interface_copy_external_user_info_by_account_type(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_userInfoInterface, {});\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString target_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"target_user_id\"));\n\n    EOS_UserInfo_CopyExternalUserInfoByAccountTypeOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_USERINFO_COPYEXTERNALUSERINFOBYACCOUNTTYPE_API_LATEST;\n    options.LocalUserId = eosg_string_to_epic_account_id(local_user_id.get_data());\n    options.TargetUserId = eosg_string_to_epic_account_id(target_user_id.get_data());\n    options.AccountType = static_cast<EOS_EExternalAccountType>(static_cast<int>(p_options->get(\"account_type\")));\n\n    EOS_UserInfo_ExternalUserInfo *outExternalUserInfo = nullptr;\n    EOS_EResult res = EOS_UserInfo_CopyExternalUserInfoByAccountType(s_userInfoInterface, &options, &outExternalUserInfo);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"external_user_info\"] = eosg_user_info_external_user_info_to_dict_and_release(outExternalUserInfo);\n    return ret;\n}\n\nDictionary IEOS::user_info_interface_copy_external_user_info_by_index(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_userInfoInterface, {});\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString target_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"target_user_id\"));\n\n    EOS_UserInfo_CopyExternalUserInfoByIndexOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_USERINFO_COPYEXTERNALUSERINFOBYINDEX_API_LATEST;\n    options.LocalUserId = eosg_string_to_epic_account_id(local_user_id.get_data());\n    options.TargetUserId = eosg_string_to_epic_account_id(target_user_id.get_data());\n    options.Index = static_cast<uint32_t>(p_options->get(\"index\"));\n\n    EOS_UserInfo_ExternalUserInfo *outExternalUserInfo = nullptr;\n    EOS_EResult res = EOS_UserInfo_CopyExternalUserInfoByIndex(s_userInfoInterface, &options, &outExternalUserInfo);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"external_user_info\"] = eosg_user_info_external_user_info_to_dict_and_release(outExternalUserInfo);\n    return ret;\n}\n\nDictionary IEOS::user_info_interface_copy_user_info(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_userInfoInterface, {});\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString target_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"target_user_id\"));\n\n    EOS_UserInfo_CopyUserInfoOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_USERINFO_COPYUSERINFO_API_LATEST;\n    options.LocalUserId = eosg_string_to_epic_account_id(local_user_id.get_data());\n    options.TargetUserId = eosg_string_to_epic_account_id(target_user_id.get_data());\n\n    EOS_UserInfo *outUserInfo = nullptr;\n    EOS_EResult res = EOS_UserInfo_CopyUserInfo(s_userInfoInterface, &options, &outUserInfo);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"user_info\"] = eosg_user_info_user_info_to_dict_and_release(outUserInfo);\n    return ret;\n}\n\nint IEOS::user_info_interface_get_external_user_info_count(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_userInfoInterface, 0);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString target_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"target_user_id\"));\n\n    EOS_UserInfo_GetExternalUserInfoCountOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_USERINFO_GETEXTERNALUSERINFOCOUNT_API_LATEST;\n    options.LocalUserId = eosg_string_to_epic_account_id(local_user_id.get_data());\n    options.TargetUserId = eosg_string_to_epic_account_id(target_user_id.get_data());\n\n    return static_cast<int>(EOS_UserInfo_GetExternalUserInfoCount(s_userInfoInterface, &options));\n}\n\nvoid IEOS::user_info_interface_query_user_info(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_userInfoInterface);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString target_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"target_user_id\"));\n\n    EOS_UserInfo_QueryUserInfoOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_USERINFO_QUERYUSERINFO_API_LATEST;\n    options.LocalUserId = eosg_string_to_epic_account_id(local_user_id.get_data());\n    options.TargetUserId = eosg_string_to_epic_account_id(target_user_id.get_data());\n    p_options->reference();\n\n    EOS_UserInfo_QueryUserInfo(s_userInfoInterface, &options, (void *)*p_options, [](const EOS_UserInfo_QueryUserInfoCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"local_user_id\"] = eosg_epic_account_id_to_string(data->LocalUserId);\n        ret[\"target_user_id\"] = eosg_epic_account_id_to_string(data->TargetUserId);\n        IEOS::get_singleton()->emit_signal(\"user_info_interface_query_user_info_callback\", ret);\n    });\n}\n\nvoid IEOS::user_info_interface_query_user_info_by_display_name(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_userInfoInterface);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString display_name = VARIANT_TO_CHARSTRING(p_options->get(\"display_name\"));\n\n    EOS_UserInfo_QueryUserInfoByDisplayNameOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_USERINFO_QUERYUSERINFOBYDISPLAYNAME_API_LATEST;\n    options.LocalUserId = eosg_string_to_epic_account_id(local_user_id.get_data());\n    options.DisplayName = display_name.get_data();\n    p_options->reference();\n\n    EOS_UserInfo_QueryUserInfoByDisplayName(s_userInfoInterface, &options, (void *)*p_options, [](const EOS_UserInfo_QueryUserInfoByDisplayNameCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"local_user_id\"] = eosg_epic_account_id_to_string(data->LocalUserId);\n        ret[\"target_user_id\"] = eosg_epic_account_id_to_string(data->TargetUserId);\n        ret[\"display_name\"] = EOSG_GET_STRING(data->DisplayName);\n        IEOS::get_singleton()->emit_signal(\"user_info_interface_query_user_info_by_display_name_callback\", ret);\n    });\n}\n\nvoid IEOS::user_info_interface_query_user_info_by_external_account(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL(s_userInfoInterface);\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString external_account_id = VARIANT_TO_CHARSTRING(p_options->get(\"external_account_id\"));\n\n    EOS_UserInfo_QueryUserInfoByExternalAccountOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_USERINFO_QUERYUSERINFOBYEXTERNALACCOUNT_API_LATEST;\n    options.LocalUserId = eosg_string_to_epic_account_id(local_user_id.get_data());\n    options.ExternalAccountId = external_account_id.get_data();\n    options.AccountType = static_cast<EOS_EExternalAccountType>(static_cast<int>(p_options->get(\"account_type\")));\n    p_options->reference();\n\n    EOS_UserInfo_QueryUserInfoByExternalAccount(s_userInfoInterface, &options, (void *)*p_options, [](const EOS_UserInfo_QueryUserInfoByExternalAccountCallbackInfo *data) {\n        Dictionary ret;\n        ret[\"result_code\"] = static_cast<int>(data->ResultCode);\n        Ref<RefCounted> client_data = reinterpret_cast<RefCounted *>(data->ClientData);\n        client_data->unreference();\n        ret[\"client_data\"] = client_data->get(\"client_data\");\n        ret[\"local_user_id\"] = eosg_epic_account_id_to_string(data->LocalUserId);\n        ret[\"target_user_id\"] = eosg_epic_account_id_to_string(data->TargetUserId);\n        ret[\"external_account_id\"] = EOSG_GET_STRING(data->ExternalAccountId);\n        ret[\"account_type\"] = static_cast<int>(data->AccountType);\n        IEOS::get_singleton()->emit_signal(\"user_info_interface_query_user_info_by_external_account_callback\", ret);\n    });\n}\n\nDictionary IEOS::user_info_interface_copy_best_display_name(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_userInfoInterface, {});\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString target_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"target_user_id\"));\n\n    EOS_UserInfo_CopyBestDisplayNameOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_USERINFO_COPYBESTDISPLAYNAME_API_LATEST;\n    options.LocalUserId = eosg_string_to_epic_account_id(local_user_id.get_data());\n    options.TargetUserId = eosg_string_to_epic_account_id(target_user_id.get_data());\n\n    EOS_UserInfo_BestDisplayName *outBestDisplayName = nullptr;\n    EOS_EResult res = EOS_UserInfo_CopyBestDisplayName(s_userInfoInterface, &options, &outBestDisplayName);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"best_display_name\"] = eosg_user_info_best_display_name_to_dict_and_release(outBestDisplayName);\n    return ret;\n}\n\nDictionary IEOS::user_info_interface_copy_best_display_name_with_platform(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_userInfoInterface, {});\n    CharString local_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"local_user_id\"));\n    CharString target_user_id = VARIANT_TO_CHARSTRING(p_options->get(\"target_user_id\"));\n    int target_platform_type = p_options->get(\"target_platform_type\");\n\n    EOS_UserInfo_CopyBestDisplayNameWithPlatformOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_USERINFO_COPYBESTDISPLAYNAMEWITHPLATFORM_API_LATEST;\n    options.LocalUserId = eosg_string_to_epic_account_id(local_user_id.get_data());\n    options.TargetUserId = eosg_string_to_epic_account_id(target_user_id.get_data());\n    options.TargetPlatformType = static_cast<EOS_OnlinePlatformType>(target_platform_type);\n\n    EOS_UserInfo_BestDisplayName *outBestDisplayName = nullptr;\n    EOS_EResult res = EOS_UserInfo_CopyBestDisplayNameWithPlatform(s_userInfoInterface, &options, &outBestDisplayName);\n\n    Dictionary ret;\n    ret[\"result_code\"] = static_cast<int>(res);\n    ret[\"best_display_name\"] = eosg_user_info_best_display_name_to_dict_and_release(outBestDisplayName);\n    return ret;\n}\n\nint IEOS::user_info_interface_get_local_platform_type(Ref<RefCounted> p_options) {\n    ERR_FAIL_NULL_V(s_userInfoInterface, static_cast<int>(EOS_OPT_Unknown));\n    EOS_UserInfo_GetLocalPlatformTypeOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_USERINFO_GETLOCALPLATFORMTYPE_API_LATEST;\n\n    return static_cast<int>(EOS_UserInfo_GetLocalPlatformType(s_userInfoInterface, &options));\n}\n"
  },
  {
    "path": "src/utils.cpp",
    "content": "#include \"utils.h\"\n\nString eosg_epic_account_id_to_string(EOS_EpicAccountId accountId) {\n    if (accountId == nullptr) {\n        return String(\"\");\n    }\n\n    char *tempBuffer = (char *)memalloc(EOS_EPICACCOUNTID_MAX_LENGTH + 1);\n    int32_t tempBufferSize = EOS_EPICACCOUNTID_MAX_LENGTH + 1;\n    EOS_EResult Result = EOS_EpicAccountId_ToString(accountId, tempBuffer, &tempBufferSize);\n\n    if (Result == EOS_EResult::EOS_Success) {\n        return String(tempBuffer);\n    }\n\n    if (IEOS::get_singleton()->isEOSValid) {\n        UtilityFunctions::printerr(\"\\n[EOSG]: eosg_epic_account_id_to_string: Got EOS Result: \", EOS_EResult_ToString(Result), \"\\n\\tat: \", __func__, \" (\", __FILE__, \":\", __LINE__, \") \", \"\\n\");\n    }\n\n    return \"\";\n}\n\nString eosg_product_user_id_to_string(EOS_ProductUserId localUserId) {\n    if (localUserId == nullptr) {\n        return String(\"\");\n    }\n\n    char *tempBuffer = (char *)memalloc(EOS_PRODUCTUSERID_MAX_LENGTH + 1);\n    int32_t tempBufferSize = EOS_PRODUCTUSERID_MAX_LENGTH + 1;\n    EOS_EResult Result = EOS_ProductUserId_ToString(localUserId, tempBuffer, &tempBufferSize);\n\n    if (Result == EOS_EResult::EOS_Success) {\n        return String(tempBuffer);\n    }\n\n    if (IEOS::get_singleton()->isEOSValid) {\n        UtilityFunctions::printerr(\"\\n[EOSG]: eosg_product_user_id_to_string: Got EOS Result: \", EOS_EResult_ToString(Result), \"\\n\\tat: \", __func__, \" (\", __FILE__, \":\", __LINE__, \") \", \"\\n\");\n    }\n\n    return String(\"\");\n}"
  },
  {
    "path": "src/utils.h",
    "content": "#pragma once\n#include \"eosg_active_session.h\"\n#include \"eosg_continuance_token.h\"\n#include \"eosg_lobby_details.h\"\n#include \"eosg_lobby_modification.h\"\n#include \"eosg_lobby_search.h\"\n#include \"eosg_playerdatastorage_file_transfer_request.h\"\n#include \"eosg_presence_modification.h\"\n#include \"eosg_session_details.h\"\n#include \"eosg_session_modification.h\"\n#include \"eosg_session_search.h\"\n#include \"eosg_titlestorage_file_transfer_request.h\"\n#include \"eosg_transaction.h\"\n#include \"godot_cpp/core/memory.hpp\"\n#include \"godot_cpp/templates/vector.hpp\"\n#include \"godot_cpp/variant/char_string.hpp\"\n#include \"godot_cpp/variant/utility_functions.hpp\"\n#include \"ieos.h\"\n\nusing namespace godot;\n\n#define VARIANT_TO_CHARSTRING(str) ((String)str).utf8()\n#define VARIANT_TO_EOS_BOOL(var) \\\n    ((var.get_type() == Variant::BOOL) ? ((var.operator bool()) ? EOS_TRUE : EOS_FALSE) : EOS_FALSE)\n#define EOSG_GET_STRING(str) ((str == nullptr) ? String(\"\") : String::utf8(str))\n#define EOSG_GET_BOOL(eosBool) ((eosBool == EOS_TRUE) ? true : false)\n\n#ifdef _MSC_VER // Check if using Microsoft Visual Studio\n#define STRNCPY_S(dest, destsz, src, count) strncpy_s(dest, destsz, src, count)\n#else\n#define STRNCPY_S(dest, destsz, src, count) strncpy(dest, src, count)\n#endif\n\n#define EOSG_EOS_HANDLE_TO_WRAPPER(m_eos_handle, m_wrapper) \\\n    if (m_eos_handle == nullptr) {                          \\\n        return Variant();                                   \\\n    }                                                       \\\n    Ref<m_wrapper> wrapper = memnew(m_wrapper());           \\\n    wrapper->set_internal(m_eos_handle);                    \\\n    return wrapper;\n\n#define PERSISTENT_CHAR_ARRAY_CREATE(array_name, storage_vector, count) \\\n    Vector<CharString> storage_vector;                                  \\\n    storage_vector.resize(count);                                       \\\n    const char **array_name = (const char **)memalloc(sizeof(char *) * (count));\n\n#define PERSISTENT_CHAR_ARRAY_SET(array_name, storage_vector, index, variant_value) \\\n    storage_vector.write[index] = VARIANT_TO_CHARSTRING(variant_value);             \\\n    array_name[index] = storage_vector[index].get_data();\n\nString eosg_epic_account_id_to_string(EOS_EpicAccountId accountId);\n\nstatic EOS_EpicAccountId eosg_string_to_epic_account_id(const char *p_account_id) {\n    EOS_EpicAccountId accountId = EOS_EpicAccountId_FromString(p_account_id);\n    return accountId;\n}\n\nString eosg_product_user_id_to_string(EOS_ProductUserId localUserId);\n\nstatic EOS_ProductUserId eosg_string_to_product_user_id(const char *p_account_id) {\n    EOS_ProductUserId productUserId = EOS_ProductUserId_FromString(p_account_id);\n    return productUserId;\n}\n\nstatic Variant eosg_auth_pin_grant_info_to_dict(const EOS_Auth_PinGrantInfo *pinGrantInfo) {\n    if (pinGrantInfo == nullptr) {\n        return Variant();\n    }\n    Dictionary ret;\n    ret[\"user_code\"] = EOSG_GET_STRING(pinGrantInfo->UserCode);\n    ret[\"verification_uri\"] = EOSG_GET_STRING(pinGrantInfo->VerificationURI);\n    ret[\"expires_in\"] = pinGrantInfo->ExpiresIn;\n    ret[\"verification_uri_complete\"] = EOSG_GET_STRING(pinGrantInfo->VerificationURIComplete);\n\n    return ret;\n}\n\nstatic Variant eosg_continuance_token_to_wrapper(EOS_ContinuanceToken p_continuance_token) {\n    EOSG_EOS_HANDLE_TO_WRAPPER(p_continuance_token, EOSGContinuanceToken);\n}\n\nstatic Variant eosg_auth_id_token_to_dict_and_release(EOS_Auth_IdToken *authIdToken) {\n    if (authIdToken == nullptr) {\n        return Variant();\n    }\n    Dictionary ret;\n    ret[\"account_id\"] = eosg_epic_account_id_to_string(authIdToken->AccountId);\n    ret[\"json_web_token\"] = EOSG_GET_STRING(authIdToken->JsonWebToken);\n    EOS_Auth_IdToken_Release(authIdToken);\n    return ret;\n}\n\nstatic Variant eosg_connect_id_token_to_dict_and_release(EOS_Connect_IdToken *connectIdToken) {\n    if (connectIdToken == nullptr) {\n        return Variant();\n    }\n    Dictionary ret;\n    ret[\"product_user_id\"] = eosg_product_user_id_to_string(connectIdToken->ProductUserId);\n    ret[\"json_web_token\"] = EOSG_GET_STRING(connectIdToken->JsonWebToken);\n    EOS_Connect_IdToken_Release(connectIdToken);\n    return ret;\n}\n\nstatic Variant eosg_auth_token_to_dict_and_release(EOS_Auth_Token *authToken) {\n    if (authToken == nullptr) {\n        return Variant();\n    }\n    Dictionary ret;\n    ret[\"app\"] = EOSG_GET_STRING(authToken->App);\n    ret[\"client_id\"] = EOSG_GET_STRING(authToken->ClientId);\n    ret[\"account_id\"] = eosg_epic_account_id_to_string(authToken->AccountId);\n    ret[\"access_token\"] = EOSG_GET_STRING(authToken->AccessToken);\n    ret[\"expires_in\"] = authToken->ExpiresIn;\n    ret[\"expires_at\"] = EOSG_GET_STRING(authToken->ExpiresAt);\n    ret[\"auth_type\"] = static_cast<int>(authToken->AuthType);\n    ret[\"refresh_token\"] = EOSG_GET_STRING(authToken->RefreshToken);\n    ret[\"refresh_expires_in\"] = authToken->RefreshExpiresIn;\n    ret[\"refresh_expires_at\"] = EOSG_GET_STRING(authToken->RefreshExpiresAt);\n    EOS_Auth_Token_Release(authToken);\n    return ret;\n}\n\nstatic Variant eosg_connect_external_account_info_to_dict_and_release(EOS_Connect_ExternalAccountInfo *externalAccountInfo) {\n    if (externalAccountInfo == nullptr) {\n        return Variant();\n    }\n\n    Dictionary ret;\n    ret[\"product_user_id\"] = eosg_product_user_id_to_string(externalAccountInfo->ProductUserId);\n    ret[\"display_name\"] = EOSG_GET_STRING(externalAccountInfo->DisplayName);\n    ret[\"account_id\"] = EOSG_GET_STRING(externalAccountInfo->AccountId);\n    ret[\"account_id_type\"] = static_cast<int>(externalAccountInfo->AccountIdType);\n    ret[\"last_login_time\"] = externalAccountInfo->LastLoginTime;\n    EOS_Connect_ExternalAccountInfo_Release(externalAccountInfo);\n    return ret;\n}\n\nstatic Variant eosg_ecom_entitlement_to_dict_and_release(EOS_Ecom_Entitlement *entitlement) {\n    if (entitlement == nullptr) {\n        return Variant();\n    }\n\n    Dictionary ret;\n    ret[\"entitlement_name\"] = EOSG_GET_STRING(entitlement->EntitlementName);\n    ret[\"entitlement_id\"] = EOSG_GET_STRING(entitlement->EntitlementId);\n    ret[\"catalog_item_id\"] = EOSG_GET_STRING(entitlement->CatalogItemId);\n    ret[\"server_id\"] = entitlement->ServerIndex;\n    ret[\"redeemed\"] = EOSG_GET_BOOL(entitlement->bRedeemed);\n    ret[\"end_timestamp\"] = entitlement->EndTimestamp;\n    EOS_Ecom_Entitlement_Release(entitlement);\n    return ret;\n}\n\nstatic Variant eosg_ecom_catalog_item_to_dict_and_release(EOS_Ecom_CatalogItem *item) {\n    if (item == nullptr) {\n        return Variant();\n    }\n\n    Dictionary ret;\n    ret[\"catalog_namespace\"] = EOSG_GET_STRING(item->CatalogNamespace);\n    ret[\"id\"] = EOSG_GET_STRING(item->Id);\n    ret[\"entitlement_name\"] = EOSG_GET_STRING(item->EntitlementName);\n    ret[\"title_text\"] = EOSG_GET_STRING(item->TitleText);\n    ret[\"description_text\"] = EOSG_GET_STRING(item->DescriptionText);\n    ret[\"long_description_text\"] = EOSG_GET_STRING(item->LongDescriptionText);\n    ret[\"technical_details_text\"] = EOSG_GET_STRING(item->TechnicalDetailsText);\n    ret[\"developer_text\"] = EOSG_GET_STRING(item->DeveloperText);\n    ret[\"item_type\"] = static_cast<int>(item->ItemType);\n    ret[\"entitlement_end_timestamp\"] = item->EntitlementEndTimestamp;\n    EOS_Ecom_CatalogItem_Release(item);\n    return ret;\n}\n\nstatic Variant eosg_ecom_key_image_info_to_dict_and_release(EOS_Ecom_KeyImageInfo *keyInfo) {\n    if (keyInfo == nullptr) {\n        return Variant();\n    }\n\n    Dictionary ret;\n    ret[\"type\"] = EOSG_GET_STRING(keyInfo->Type);\n    ret[\"url\"] = EOSG_GET_STRING(keyInfo->Url);\n    ret[\"width\"] = keyInfo->Width;\n    ret[\"height\"] = keyInfo->Height;\n    EOS_Ecom_KeyImageInfo_Release(keyInfo);\n    return ret;\n}\n\nstatic Variant eosg_ecom_catalog_release_to_dict_and_release(EOS_Ecom_CatalogRelease *release) {\n    if (release == nullptr) {\n        return Variant();\n    }\n\n    Dictionary ret;\n    Array compatible_app_ids = Array();\n    for (int i = 0; i < release->CompatibleAppIdCount; i++) {\n        compatible_app_ids.append(EOSG_GET_STRING(release->CompatibleAppIds[i]));\n    }\n    ret[\"compatible_app_ids\"] = compatible_app_ids;\n    Array compatible_platforms = Array();\n    for (int i = 0; i < release->CompatiblePlatformCount; i++) {\n        compatible_platforms.append(EOSG_GET_STRING(release->CompatiblePlatforms[i]));\n    }\n    ret[\"compatible_platforms\"] = compatible_platforms;\n    ret[\"release_note\"] = EOSG_GET_STRING(release->ReleaseNote);\n    EOS_Ecom_CatalogRelease_Release(release);\n    return ret;\n}\n\nstatic Variant eosg_ecom_catalog_offer_to_dict_and_release(EOS_Ecom_CatalogOffer *offer) {\n    if (offer == nullptr) {\n        return Variant();\n    }\n\n    Dictionary ret;\n    ret[\"server_index\"] = offer->ServerIndex;\n    ret[\"catalog_namespace\"] = EOSG_GET_STRING(offer->CatalogNamespace);\n    ret[\"id\"] = EOSG_GET_STRING(offer->Id);\n    ret[\"title_text\"] = EOSG_GET_STRING(offer->TitleText);\n    ret[\"description_text\"] = EOSG_GET_STRING(offer->DescriptionText);\n    ret[\"long_description_text\"] = EOSG_GET_STRING(offer->LongDescriptionText);\n    ret[\"currency_code\"] = EOSG_GET_STRING(offer->CurrencyCode);\n    ret[\"discount_percentage\"] = offer->DiscountPercentage;\n    ret[\"expiration_timestamp\"] = offer->ExpirationTimestamp;\n    ret[\"purchase_limit\"] = offer->PurchaseLimit;\n    ret[\"available_for_purchase\"] = EOSG_GET_BOOL(offer->bAvailableForPurchase);\n    ret[\"price_result\"] = static_cast<int>(offer->PriceResult);\n    ret[\"original_price\"] = offer->OriginalPrice64;\n    ret[\"current_price\"] = offer->CurrentPrice64;\n    ret[\"decimal_point\"] = offer->DecimalPoint;\n    ret[\"release_date_timstamp\"] = offer->ReleaseDateTimestamp;\n    ret[\"effective_date_timestamp\"] = offer->EffectiveDateTimestamp;\n    EOS_Ecom_CatalogOffer_Release(offer);\n    return ret;\n}\n\nstatic Variant eosg_ecom_transaction_to_wrapper(EOS_Ecom_HTransaction p_transaction) {\n    EOSG_EOS_HANDLE_TO_WRAPPER(p_transaction, EOSGTransaction);\n}\n\nstatic Variant eosg_user_info_external_user_info_to_dict_and_release(EOS_UserInfo_ExternalUserInfo *externalUserInfo) {\n    if (externalUserInfo == nullptr) {\n        return Variant();\n    }\n\n    Dictionary ret;\n    ret[\"account_type\"] = static_cast<int>(externalUserInfo->AccountType);\n    ret[\"account_id\"] = EOSG_GET_STRING(externalUserInfo->AccountId);\n    ret[\"display_name\"] = EOSG_GET_STRING(externalUserInfo->DisplayName);\n    ret[\"display_name_sanitized\"] = EOSG_GET_STRING(externalUserInfo->DisplayNameSanitized);\n    EOS_UserInfo_ExternalUserInfo_Release(externalUserInfo);\n    return ret;\n}\n\nstatic Variant eosg_user_info_user_info_to_dict_and_release(EOS_UserInfo *userInfo) {\n    if (userInfo == nullptr) {\n        return Variant();\n    }\n\n    Dictionary ret;\n    ret[\"user_id\"] = eosg_epic_account_id_to_string(userInfo->UserId);\n    ret[\"country\"] = EOSG_GET_STRING(userInfo->Country);\n    ret[\"display_name\"] = EOSG_GET_STRING(userInfo->DisplayName);\n    ret[\"display_name_sanitized\"] = EOSG_GET_STRING(userInfo->DisplayNameSanitized);\n    ret[\"preferred_language\"] = EOSG_GET_STRING(userInfo->PreferredLanguage);\n    ret[\"nickname\"] = EOSG_GET_STRING(userInfo->Nickname);\n    EOS_UserInfo_Release(userInfo);\n    return ret;\n}\n\nstatic Variant eosg_user_info_best_display_name_to_dict_and_release(EOS_UserInfo_BestDisplayName *bestDisplayName) {\n    if (bestDisplayName == nullptr) {\n        return Variant();\n    }\n\n    Dictionary ret;\n    ret[\"user_id\"] = eosg_epic_account_id_to_string(bestDisplayName->UserId);\n    ret[\"display_name\"] = EOSG_GET_STRING(bestDisplayName->DisplayName);\n    ret[\"display_name_sanitized\"] = EOSG_GET_STRING(bestDisplayName->DisplayNameSanitized);\n    ret[\"nickname\"] = EOSG_GET_STRING(bestDisplayName->Nickname);\n    ret[\"platform_type\"] = static_cast<int>(bestDisplayName->PlatformType);\n    EOS_UserInfo_BestDisplayName_Release(bestDisplayName);\n    return ret;\n}\n\nstatic Variant eosg_mods_mod_info_to_dict_and_release(EOS_Mods_ModInfo *modsInfo) {\n    if (modsInfo == nullptr) {\n        return Variant();\n    }\n\n    Dictionary ret;\n    ret[\"mods_count\"] = static_cast<int>(modsInfo->ModsCount);\n    ret[\"type\"] = static_cast<int>(modsInfo->Type);\n    Array mods = Array();\n\n    if (modsInfo->ModsCount > 0 && modsInfo->Mods != nullptr) {\n        for (int i = 0; i < modsInfo->ModsCount; i++) {\n            EOS_Mod_Identifier mod = modsInfo->Mods[i];\n            Dictionary mod_dict;\n            mod_dict[\"namespace_id\"] = EOSG_GET_STRING(mod.NamespaceId);\n            mod_dict[\"item_id\"] = EOSG_GET_STRING(mod.ItemId);\n            mod_dict[\"artifact_id\"] = EOSG_GET_STRING(mod.ArtifactId);\n            mod_dict[\"title\"] = EOSG_GET_STRING(mod.Title);\n            mod_dict[\"version\"] = EOSG_GET_STRING(mod.Version);\n            mods.append(mod_dict);\n        }\n    }\n    ret[\"mods\"] = mods;\n    EOS_Mods_ModInfo_Release(modsInfo);\n    return ret;\n}\n\n\nstatic Variant eosg_mods_mod_identifier_to_dict(const EOS_Mod_Identifier *mod) {\n    if (mod == nullptr) {\n        return Variant();\n    }\n    Dictionary ret;\n    ret[\"namespace_id\"] = EOSG_GET_STRING(mod->NamespaceId);\n    ret[\"item_id\"] = EOSG_GET_STRING(mod->ItemId);\n    ret[\"artifact_id\"] = EOSG_GET_STRING(mod->ArtifactId);\n    ret[\"title\"] = EOSG_GET_STRING(mod->Title);\n    ret[\"version\"] = EOSG_GET_STRING(mod->Version);\n    return ret;\n}\n\nstatic Variant eosg_presence_presence_info_to_dict_and_release(EOS_Presence_Info *presence) {\n    if (presence == nullptr) {\n        return Variant();\n    }\n    Dictionary ret;\n    ret[\"status\"] = static_cast<int>(presence->Status);\n    ret[\"user_id\"] = eosg_epic_account_id_to_string(presence->UserId);\n    ret[\"product_id\"] = EOSG_GET_STRING(presence->ProductId);\n    ret[\"product_version\"] = EOSG_GET_STRING(presence->ProductVersion);\n    ret[\"platform\"] = EOSG_GET_STRING(presence->Platform);\n    ret[\"rich_text\"] = EOSG_GET_STRING(presence->RichText);\n    ret[\"product_name\"] = EOSG_GET_STRING(presence->ProductName);\n    ret[\"integrated_platform\"] = EOSG_GET_STRING(presence->IntegratedPlatform);\n\n    Array records = Array();\n    if (presence->RecordsCount > 0 && presence->Records != nullptr) {\n        for (int i = 0; i < presence->RecordsCount; i++) {\n            EOS_Presence_DataRecord record = presence->Records[i];\n            Dictionary record_dict;\n            record_dict[\"key\"] = EOSG_GET_STRING(record.Key);\n            record_dict[\"value\"] = EOSG_GET_STRING(record.Value);\n            records.append(record_dict);\n        }\n    }\n    ret[\"records\"] = records;\n    EOS_Presence_Info_Release(presence);\n    return ret;\n}\n\nstatic Variant eosg_presence_presence_modification_to_wrapper(EOS_HPresenceModification p_presence_modification) {\n    EOSG_EOS_HANDLE_TO_WRAPPER(p_presence_modification, EOSGPresenceModification);\n}\n\nstatic Variant eosg_achievements_definition_to_dict_and_release(EOS_Achievements_DefinitionV2 *definition) {\n    if (definition == nullptr) {\n        return Variant();\n    }\n    Dictionary ret;\n    ret[\"achievement_id\"] = EOSG_GET_STRING(definition->AchievementId);\n    ret[\"unlocked_display_name\"] = EOSG_GET_STRING(definition->UnlockedDisplayName);\n    ret[\"unlocked_description\"] = EOSG_GET_STRING(definition->UnlockedDescription);\n    ret[\"locked_display_name\"] = EOSG_GET_STRING(definition->LockedDisplayName);\n    ret[\"locked_description\"] = EOSG_GET_STRING(definition->LockedDescription);\n    ret[\"flavor_text\"] = EOSG_GET_STRING(definition->FlavorText);\n    ret[\"unlocked_icon_url\"] = EOSG_GET_STRING(definition->UnlockedIconURL);\n    ret[\"locked_icon_url\"] = EOSG_GET_STRING(definition->LockedIconURL);\n    ret[\"is_hidden\"] = EOSG_GET_BOOL(definition->bIsHidden);\n\n    Array stat_thresholds = Array();\n    for (int i = 0; i < definition->StatThresholdsCount; i++) {\n        Dictionary stat_threshold_dict;\n        stat_threshold_dict[\"name\"] = EOSG_GET_STRING(definition->StatThresholds[i].Name);\n        stat_threshold_dict[\"threshold\"] = definition->StatThresholds[i].Threshold;\n        stat_thresholds.append(stat_threshold_dict);\n    }\n    ret[\"stat_thresholds\"] = stat_thresholds;\n    EOS_Achievements_DefinitionV2_Release(definition);\n    return ret;\n}\n\nstatic Variant eosg_achievements_player_achievement_to_dict_and_release(EOS_Achievements_PlayerAchievement *achievement) {\n    if (achievement == nullptr) {\n        return Variant();\n    }\n    Dictionary ret;\n    ret[\"achievement_id\"] = EOSG_GET_STRING(achievement->AchievementId);\n    ret[\"progress\"] = achievement->Progress;\n    ret[\"unlock_time\"] = achievement->UnlockTime;\n    ret[\"display_name\"] = EOSG_GET_STRING(achievement->DisplayName);\n    ret[\"description\"] = EOSG_GET_STRING(achievement->Description);\n    ret[\"icon_url\"] = EOSG_GET_STRING(achievement->IconURL);\n    ret[\"flavor_text\"] = EOSG_GET_STRING(achievement->FlavorText);\n    Array stat_infos = Array();\n    for (int i = 0; i < achievement->StatInfoCount; i++) {\n        Dictionary stat_info_dict;\n        stat_info_dict[\"name\"] = EOSG_GET_STRING(achievement->StatInfo[i].Name);\n        stat_info_dict[\"current_value\"] = achievement->StatInfo[i].CurrentValue;\n        stat_info_dict[\"threshold_value\"] = achievement->StatInfo[i].ThresholdValue;\n        stat_infos.append(stat_info_dict);\n    }\n    ret[\"stat_infos\"] = stat_infos;\n    EOS_Achievements_PlayerAchievement_Release(achievement);\n    return ret;\n}\n\nstatic Variant eosg_stats_stat_to_dict_and_release(EOS_Stats_Stat *stat) {\n    if (stat == nullptr) {\n        return Variant();\n    }\n    Dictionary ret;\n    ret[\"name\"] = EOSG_GET_STRING(stat->Name);\n    ret[\"start_time\"] = stat->StartTime;\n    ret[\"end_time\"] = stat->EndTime;\n    ret[\"value\"] = stat->Value;\n    EOS_Stats_Stat_Release(stat);\n    return ret;\n}\n\nstatic Variant eosg_leaderboards_definition_to_dict_and_release(EOS_Leaderboards_Definition *definition) {\n    if (definition == nullptr) {\n        return Variant();\n    }\n    Dictionary ret;\n    ret[\"leaderboard_id\"] = EOSG_GET_STRING(definition->LeaderboardId);\n    ret[\"stat_name\"] = EOSG_GET_STRING(definition->StatName);\n    ret[\"aggregation\"] = static_cast<int>(definition->Aggregation);\n    ret[\"start_time\"] = definition->StartTime;\n    ret[\"end_time\"] = definition->EndTime;\n    EOS_Leaderboards_Definition_Release(definition);\n    return ret;\n}\n\nstatic Variant eosg_leaderboards_leaderboard_record_to_dict_and_release(EOS_Leaderboards_LeaderboardRecord *record) {\n    if (record == nullptr) {\n        return Variant();\n    }\n    Dictionary ret;\n    ret[\"user_id\"] = eosg_product_user_id_to_string(record->UserId);\n    ret[\"rank\"] = record->Rank;\n    ret[\"score\"] = record->Score;\n    ret[\"user_display_name\"] = EOSG_GET_STRING(record->UserDisplayName);\n    EOS_Leaderboards_LeaderboardRecord_Release(record);\n    return ret;\n}\n\nstatic Variant eosg_leaderboards_leaderboard_user_score_to_dict_and_release(EOS_Leaderboards_LeaderboardUserScore *userScore) {\n    if (userScore == nullptr) {\n        return Variant();\n    }\n    Dictionary ret;\n    ret[\"user_id\"] = eosg_product_user_id_to_string(userScore->UserId);\n    ret[\"score\"] = userScore->Score;\n    EOS_Leaderboards_LeaderboardUserScore_Release(userScore);\n    return ret;\n}\n\nstatic Variant eosg_kws_permission_status_to_dict_and_release(EOS_KWS_PermissionStatus *permission) {\n    if (permission == nullptr) {\n        return Variant();\n    }\n    Dictionary ret;\n    ret[\"name\"] = EOSG_GET_STRING(permission->Name);\n    ret[\"status\"] = static_cast<int>(permission->Status);\n    EOS_KWS_PermissionStatus_Release(permission);\n    return ret;\n}\n\nstatic Variant eosg_lobby_details_info_to_dict_and_release(EOS_LobbyDetails_Info *info) {\n    if (info == nullptr) {\n        return Variant();\n    }\n    Dictionary ret;\n    ret[\"lobby_id\"] = EOSG_GET_STRING(info->LobbyId);\n    ret[\"lobby_owner_user_id\"] = eosg_product_user_id_to_string(info->LobbyOwnerUserId);\n    ret[\"permission_level\"] = static_cast<int>(info->PermissionLevel);\n    ret[\"available_slots\"] = info->AvailableSlots;\n    ret[\"max_members\"] = info->MaxMembers;\n    ret[\"allow_invites\"] = EOSG_GET_BOOL(info->bAllowInvites);\n    ret[\"bucket_id\"] = EOSG_GET_STRING(info->BucketId);\n    ret[\"allow_host_migration\"] = EOSG_GET_BOOL(info->bAllowHostMigration);\n    ret[\"rtc_room_enabled\"] = EOSG_GET_BOOL(info->bRTCRoomEnabled);\n    ret[\"allow_join_by_id\"] = EOSG_GET_BOOL(info->bAllowJoinById);\n    ret[\"rejoin_after_kick_requires_invite\"] = EOSG_GET_BOOL(info->bRejoinAfterKickRequiresInvite);\n    ret[\"presence_enabled\"] = EOSG_GET_BOOL(info->bPresenceEnabled);\n    Array allowed_platform_ids = Array();\n    for (int i = 0; i < info->AllowedPlatformIdsCount; i++) {\n        allowed_platform_ids.append(static_cast<int>(info->AllowedPlatformIds[i]));\n    }\n    ret[\"allowed_platform_ids\"] = allowed_platform_ids;\n    EOS_LobbyDetails_Info_Release(info);\n    return ret;\n}\n\nstatic Variant eosg_lobby_details_member_info_to_dict_and_release(EOS_LobbyDetails_MemberInfo *memberInfo) {\n    if (memberInfo == nullptr) {\n        return Variant();\n    }\n    Dictionary ret;\n    ret[\"user_id\"] = eosg_product_user_id_to_string(memberInfo->UserId);\n    ret[\"platform\"] = static_cast<int>(memberInfo->Platform);\n    ret[\"allows_crossplay\"] = EOSG_GET_BOOL(memberInfo->bAllowsCrossplay);\n    EOS_LobbyDetails_MemberInfo_Release(memberInfo);\n    return ret;\n}\n\nstatic Variant eosg_lobby_attribute_data_to_dict(EOS_Lobby_AttributeData *attributeData) {\n    if (attributeData == nullptr) {\n        return Variant();\n    }\n    Dictionary ret;\n    ret[\"key\"] = EOSG_GET_STRING(attributeData->Key);\n    ret[\"value_type\"] = static_cast<int>(attributeData->ValueType);\n\n    switch (attributeData->ValueType) {\n        case EOS_EAttributeType::EOS_AT_BOOLEAN:\n            ret[\"value\"] = attributeData->Value.AsBool;\n            break;\n        case EOS_EAttributeType::EOS_AT_INT64:\n            ret[\"value\"] = attributeData->Value.AsInt64;\n            break;\n        case EOS_EAttributeType::EOS_AT_DOUBLE:\n            ret[\"value\"] = attributeData->Value.AsDouble;\n            break;\n        case EOS_EAttributeType::EOS_AT_STRING:\n            ret[\"value\"] = EOSG_GET_STRING(attributeData->Value.AsUtf8);\n            break;\n        default:\n            UtilityFunctions::printerr(\"\\nError: EOSG Utils: eosg_lobby_attribute_data_to_dict: Unknown value type: \", static_cast<int>(attributeData->ValueType), \"\\n\\tat: \", __func__, \" (\", __FILE__, \":\", __LINE__, \") \", \"\\n\");\n            break;\n    }\n\n    return ret;\n}\n\nstatic Variant eosg_lobby_attribute_to_dict_and_release(EOS_Lobby_Attribute *attribute) {\n    if (attribute == nullptr) {\n        return Variant();\n    }\n    Dictionary ret;\n    ret[\"visibility\"] = static_cast<int>(attribute->Visibility);\n    ret[\"data\"] = eosg_lobby_attribute_data_to_dict(attribute->Data);\n    EOS_Lobby_Attribute_Release(attribute);\n    return ret;\n}\n\nstatic Variant eosg_lobby_lobby_modification_to_wrapper(EOS_HLobbyModification lobbyModification) {\n    EOSG_EOS_HANDLE_TO_WRAPPER(lobbyModification, EOSGLobbyModification);\n}\n\nstatic Variant eosg_lobby_lobby_search_to_wrapper(EOS_HLobbySearch lobbySearch) {\n    EOSG_EOS_HANDLE_TO_WRAPPER(lobbySearch, EOSGLobbySearch);\n}\n\nstatic Variant eosg_lobby_lobby_details_to_wrapper(EOS_HLobbyDetails lobbyDetails) {\n    EOSG_EOS_HANDLE_TO_WRAPPER(lobbyDetails, EOSGLobbyDetails);\n}\n\nstatic EOS_Lobby_LocalRTCOptions eosg_variant_to_lobby_local_rtc_options(Variant p_local_rtc_options) {\n    Dictionary local_rtc_options = p_local_rtc_options;\n\n    int flags = 0;\n    if (local_rtc_options.has(\"flags\")) {\n        flags = local_rtc_options[\"flags\"];\n    }\n    bool use_manual_audio_input = false;\n    if (local_rtc_options.has(\"use_manual_audio_input\")) {\n        use_manual_audio_input = local_rtc_options[\"use_manual_audio_input\"];\n    }\n    bool use_manual_audio_output = false;\n    if (local_rtc_options.has(\"use_manual_audio_output\")) {\n        use_manual_audio_output = local_rtc_options[\"use_manual_audio_output\"];\n    }\n    bool local_audio_device_input_starts_muted = false;\n    if (local_rtc_options.has(\"local_audio_device_input_starts_muted\")) {\n        local_audio_device_input_starts_muted = local_rtc_options[\"local_audio_device_input_starts_muted\"];\n    }\n\n    EOS_Lobby_LocalRTCOptions options;\n    memset(&options, 0, sizeof(options));\n    options.ApiVersion = EOS_LOBBY_LOCALRTCOPTIONS_API_LATEST;\n    options.Flags = flags;\n    options.bUseManualAudioInput = use_manual_audio_input ? EOS_TRUE : EOS_FALSE;\n    options.bUseManualAudioOutput = use_manual_audio_output ? EOS_TRUE : EOS_FALSE;\n    options.bLocalAudioDeviceInputStartsMuted = local_audio_device_input_starts_muted ? EOS_TRUE : EOS_FALSE;\n\n    return options;\n}\n\nstatic Variant eosg_playerdatastorage_file_metadata_to_dict_and_release(EOS_PlayerDataStorage_FileMetadata *metadata) {\n    if (metadata == nullptr) {\n        return Variant();\n    }\n\n    Dictionary ret;\n    ret[\"file_size_bytes\"] = metadata->FileSizeBytes;\n    ret[\"md5_hash\"] = EOSG_GET_STRING(metadata->MD5Hash);\n    ret[\"filename\"] = EOSG_GET_STRING(metadata->Filename);\n    ret[\"last_modified_time\"] = metadata->LastModifiedTime;\n    ret[\"unencrypted_data_size_bytes\"] = metadata->UnencryptedDataSizeBytes;\n    EOS_PlayerDataStorage_FileMetadata_Release(metadata);\n    return ret;\n}\n\nstatic Variant eosg_playerdatastorage_file_tranfer_request_to_wrapper(EOS_HPlayerDataStorageFileTransferRequest request) {\n    EOSG_EOS_HANDLE_TO_WRAPPER(request, EOSGPlayerDataStorageFileTransferRequest);\n}\n\nstatic Variant eosg_titlestorage_file_metadata_to_dict_and_release(EOS_TitleStorage_FileMetadata *metadata) {\n    if (metadata == nullptr) {\n        return Variant();\n    }\n\n    Dictionary ret;\n    ret[\"file_size_bytes\"] = metadata->FileSizeBytes;\n    ret[\"md5_hash\"] = EOSG_GET_STRING(metadata->MD5Hash);\n    ret[\"filename\"] = EOSG_GET_STRING(metadata->Filename);\n    ret[\"unencrypted_data_size_bytes\"] = metadata->UnencryptedDataSizeBytes;\n    EOS_TitleStorage_FileMetadata_Release(metadata);\n    return ret;\n}\n\nstatic Variant eosg_titlestorage_file_tranfer_request_to_wrapper(EOS_HTitleStorageFileTransferRequest request) {\n    EOSG_EOS_HANDLE_TO_WRAPPER(request, EOSGTitleStorageFileTransferRequest);\n}\n\nstatic Variant eosg_sanctions_player_sanction_to_dict_and_release(EOS_Sanctions_PlayerSanction *playerSanction) {\n    if (playerSanction == nullptr) {\n        return Variant();\n    }\n\n    Dictionary ret;\n    ret[\"time_placed\"] = playerSanction->TimePlaced;\n    ret[\"action\"] = EOSG_GET_STRING(playerSanction->Action);\n    ret[\"time_expires\"] = playerSanction->TimeExpires;\n    ret[\"reference_id\"] = EOSG_GET_STRING(playerSanction->ReferenceId);\n    EOS_Sanctions_PlayerSanction_Release(playerSanction);\n    return ret;\n}\n\nstatic Variant eosg_sessions_session_details_settings_to_dict(const EOS_SessionDetails_Settings *settings) {\n    if (settings == nullptr) {\n        return Variant();\n    }\n\n    Dictionary ret;\n    ret[\"bucket_id\"] = EOSG_GET_STRING(settings->BucketId);\n    ret[\"num_public_connections\"] = static_cast<int>(settings->NumPublicConnections);\n    ret[\"allow_join_in_progress\"] = EOSG_GET_BOOL(settings->bAllowJoinInProgress);\n    ret[\"permission_level\"] = static_cast<int>(settings->PermissionLevel);\n    ret[\"invites_allowed\"] = EOSG_GET_BOOL(settings->bInvitesAllowed);\n    ret[\"sanctions_enabled\"] = EOSG_GET_BOOL(settings->bSanctionsEnabled);\n\n    Array allowed_platform_ids_array = Array();\n    for (int i = 0; i < settings->AllowedPlatformIdsCount; i++) {\n        allowed_platform_ids_array.append(static_cast<int>(settings->AllowedPlatformIds[i]));\n    }\n    ret[\"allowed_platform_ids\"] = allowed_platform_ids_array;\n    return ret;\n}\n\nstatic Variant eosg_sessions_session_details_info_to_dict(const EOS_SessionDetails_Info *sessionDetails) {\n    if (sessionDetails == nullptr) {\n        return Variant();\n    }\n\n    Dictionary ret;\n    ret[\"session_id\"] = EOSG_GET_STRING(sessionDetails->SessionId);\n    ret[\"host_address\"] = EOSG_GET_STRING(sessionDetails->HostAddress);\n    ret[\"num_open_public_connections\"] = static_cast<int>(sessionDetails->NumOpenPublicConnections);\n    ret[\"owner_user_id\"] = eosg_product_user_id_to_string(sessionDetails->OwnerUserId);\n    ret[\"owner_server_client_id\"] = EOSG_GET_STRING(sessionDetails->OwnerServerClientId);\n    ret[\"settings\"] = eosg_sessions_session_details_settings_to_dict(sessionDetails->Settings);\n    return ret;\n}\n\nstatic Variant eosg_sessions_session_details_info_to_dict_and_release(EOS_SessionDetails_Info *sessionDetails) {\n    Variant ret = eosg_sessions_session_details_info_to_dict(sessionDetails);\n    EOS_SessionDetails_Info_Release(sessionDetails);\n    return ret;\n}\n\nstatic Variant eosg_sessions_active_session_info_to_dict_and_release(EOS_ActiveSession_Info *info) {\n    if (info == nullptr) {\n        return Variant();\n    }\n\n    Dictionary ret;\n    ret[\"session_name\"] = EOSG_GET_STRING(info->SessionName);\n    ret[\"local_user_id\"] = eosg_product_user_id_to_string(info->LocalUserId);\n    ret[\"state\"] = static_cast<int>(info->State);\n    ret[\"session_details\"] = eosg_sessions_session_details_info_to_dict(info->SessionDetails);\n    EOS_ActiveSession_Info_Release(info);\n    return ret;\n}\n\nstatic Variant eosg_sessions_attribute_data_to_dict(EOS_Sessions_AttributeData *attributeData) {\n    if (attributeData == nullptr) {\n        return Variant();\n    }\n    Dictionary ret;\n    ret[\"key\"] = EOSG_GET_STRING(attributeData->Key);\n    ret[\"value_type\"] = static_cast<int>(attributeData->ValueType);\n\n    switch (attributeData->ValueType) {\n        case EOS_EAttributeType::EOS_AT_INT64:\n            ret[\"value\"] = attributeData->Value.AsInt64;\n            break;\n        case EOS_EAttributeType::EOS_AT_DOUBLE:\n            ret[\"value\"] = attributeData->Value.AsDouble;\n            break;\n        case EOS_EAttributeType::EOS_AT_STRING:\n            ret[\"value\"] = EOSG_GET_STRING(attributeData->Value.AsUtf8);\n            break;\n        default:\n            UtilityFunctions::printerr(\"\\nError: EOSG Utils: eosg_sessions_attribute_data_to_dict: Unknown value type: \", static_cast<int>(attributeData->ValueType), \"\\n\\tat: \", __func__, \" (\", __FILE__, \":\", __LINE__, \") \", \"\\n\");\n            break;\n    }\n\n    return ret;\n}\n\nstatic Variant eosg_sessions_session_details_attribute_to_dict_and_release(EOS_SessionDetails_Attribute *attribute) {\n    if (attribute == nullptr) {\n        return Variant();\n    }\n\n    Dictionary ret;\n    ret[\"data\"] = eosg_sessions_attribute_data_to_dict(attribute->Data);\n    ret[\"advertisement_type\"] = static_cast<int>(attribute->AdvertisementType);\n    EOS_SessionDetails_Attribute_Release(attribute);\n    return ret;\n}\n\nstatic Variant eosg_sessions_active_session_to_wrapper(EOS_HActiveSession p_active_session) {\n    EOSG_EOS_HANDLE_TO_WRAPPER(p_active_session, EOSGActiveSession);\n}\n\nstatic Variant eosg_sessions_session_details_to_wrapper(EOS_HSessionDetails p_session_details) {\n    EOSG_EOS_HANDLE_TO_WRAPPER(p_session_details, EOSGSessionDetails);\n}\n\nstatic Variant eosg_sessions_session_modification_to_wrapper(EOS_HSessionModification p_session_modification) {\n    EOSG_EOS_HANDLE_TO_WRAPPER(p_session_modification, EOSGSessionModification);\n}\n\nstatic Variant eosg_sessions_session_search_to_wrapper(EOS_HSessionSearch p_session_search) {\n    EOSG_EOS_HANDLE_TO_WRAPPER(p_session_search, EOSGSessionSearch);\n}\n\nstatic Variant eosg_rtc_audio_input_device_information_to_dict_and_release(EOS_RTCAudio_InputDeviceInformation *info) {\n    if (info == nullptr) {\n        return Variant();\n    }\n\n    Dictionary ret;\n    ret[\"default_device\"] = EOSG_GET_BOOL(info->bDefaultDevice);\n    ret[\"device_id\"] = EOSG_GET_STRING(info->DeviceId);\n    ret[\"device_name\"] = EOSG_GET_STRING(info->DeviceName);\n    EOS_RTCAudio_InputDeviceInformation_Release(info);\n    return ret;\n}\n\nstatic Variant eosg_rtc_audio_output_device_information_to_dict_and_release(EOS_RTCAudio_OutputDeviceInformation *info) {\n    if (info == nullptr) {\n        return Variant();\n    }\n\n    Dictionary ret;\n    ret[\"default_device\"] = EOSG_GET_BOOL(info->bDefaultDevice);\n    ret[\"device_id\"] = EOSG_GET_STRING(info->DeviceId);\n    ret[\"device_name\"] = EOSG_GET_STRING(info->DeviceName);\n    EOS_RTCAudio_OutputDeviceInformation_Release(info);\n    return ret;\n}\n\nstatic Variant eosg_rtc_audio_audio_buffer_to_dict(EOS_RTCAudio_AudioBuffer *audio_buffer) {\n    if (audio_buffer == nullptr) {\n        return Variant();\n    }\n\n    Dictionary ret;\n    ret[\"frames_count\"] = static_cast<int>(audio_buffer->FramesCount);\n    Array frames = Array();\n    for (int i = 0; i < audio_buffer->FramesCount; i++) {\n        frames.append(audio_buffer->Frames[i]);\n    }\n    ret[\"frames\"] = frames;\n    ret[\"sample_rate\"] = audio_buffer->SampleRate;\n    ret[\"channels\"] = audio_buffer->Channels;\n    return ret;\n}\n"
  },
  {
    "path": "src/version_interface.cpp",
    "content": "#include \"ieos.h\"\nusing namespace godot;\n\nString IEOS::version_interface_get_version() {\n    return EOSG_GET_STRING(EOS_GetVersion());\n}\n\nDictionary IEOS::version_interface_get_constants() {\n    Dictionary constants = Dictionary();\n    constants[\"company_name\"] = EOS_COMPANY_NAME;\n    constants[\"copyright_string\"] = EOS_COPYRIGHT_STRING;\n    constants[\"product_name\"] = EOS_PRODUCT_NAME;\n    constants[\"product_identifier\"] = EOS_PRODUCT_IDENTIFIER;\n    constants[\"major_version\"] = EOS_MAJOR_VERSION;\n    constants[\"minor_version\"] = EOS_MINOR_VERSION;\n    constants[\"patch_version\"] = EOS_PATCH_VERSION;\n\n    return constants;\n}"
  },
  {
    "path": "thirdparty/Paste the EOS C SDK here as eos-sdk",
    "content": ""
  }
]