[
  {
    "path": ".github/dependabot.yml",
    "content": "# To get started with Dependabot version updates, you'll need to specify which\n# package ecosystems to update and where the package manifests are located.\n# Please see the documentation for all configuration options:\n# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates\n\nversion: 2\nupdates:\n  - package-ecosystem: \"npm\"\n    directory: \"/driver\"\n    schedule:\n      interval: \"weekly\"\n  - package-ecosystem: \"npm\"\n    directory: \"/example/nodejs\"\n    schedule:\n      interval: \"weekly\"\n  - package-ecosystem: \"npm\"\n    directory: \"/finder/nodejs\"\n    schedule:\n      interval: \"weekly\"\n  - package-ecosystem: \"pip\"\n    directory: \"/finder/python\"\n    schedule:\n      interval: \"weekly\"\n  - package-ecosystem: \"bundler\"\n    directory: \"/finder/ruby\"\n    schedule:\n      interval: \"weekly\"\n  - package-ecosystem: github-actions\n    directory: \"/\"\n    schedule:\n      interval: weekly\n      time: \"11:00\"\n      day: \"tuesday\"\n    open-pull-requests-limit: 5\n    commit-message:\n      prefix: \"ci\"\n      include: \"scope\"\n"
  },
  {
    "path": ".github/workflows/dotnet.yml",
    "content": "# This workflow will build a .NET project\n# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-net\n\nname: .NET\n\non:\n  workflow_dispatch:\n  push:\n    paths:\n      - 'finder/python/**'\n    branches: [ main ]\n  pull_request:\n    paths:\n      - 'finder/python/**'\n    branches: [ main ]\n\njobs:\n  build:\n\n    runs-on: ubuntu-latest\n\n    steps:\n    - uses: actions/checkout@v6\n    - name: Setup .NET\n      uses: actions/setup-dotnet@v5\n      with:\n        dotnet-version: 6.0.x\n    - name: Restore dependencies\n      run: dotnet restore\n      working-directory: finder/dotnet\n    - name: Build\n      run: dotnet build --no-restore\n      working-directory: finder/dotnet\n    - name: Run tests\n      run: dotnet test --no-build --verbosity normal\n      working-directory: finder/dotnet\n"
  },
  {
    "path": ".github/workflows/driver-function.yml",
    "content": "name: Run quick functionality check\n\non:\n  workflow_dispatch:\n  push:\n    paths:\n      - 'driver/**'\n    branches: [ main ]\n  pull_request:\n    paths:\n      - 'driver/**'\n    branches: [ main ]\n\nconcurrency:\n  group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}\n  cancel-in-progress: true\n\njobs:\n  ios_test:\n    runs-on: macos-15\n\n    env:\n      XCODE_VERSION: 16.4\n      IOS_DEVICE_NAME: iPhone 16 Plus\n      IOS_VERSION: 18.5\n\n    steps:\n    - uses: actions/checkout@v6\n\n    - name: Install Node.js\n      uses: actions/setup-node@v6\n      with:\n        node-version: 'lts/*'\n\n    - name: Select Xcode\n      uses: maxim-lobanov/setup-xcode@v1\n      with:\n        xcode-version: ${{ env.XCODE_VERSION }}\n    - run: defaults write com.apple.iphonesimulator PasteboardAutomaticSync -bool false\n\n    - uses: futureware-tech/simulator-action@v5\n      with:\n        # https://github.com/actions/runner-images/blob/main/images/macos/macos-15-arm64-Readme.md\n        model: ${{ env.IOS_DEVICE_NAME }}\n        os_version: ${{ env.IOS_VERSION }}\n\n    # Start Appium\n    - run: npm install -g appium\n    - run: |\n        npm install\n        appium driver install --source=local ./\n        nohup appium --log-timestamp --log-no-colors > appium.log &\n      working-directory:\n        driver\n\n    - name: Set up Ruby\n      uses: ruby/setup-ruby@v1\n      with:\n        ruby-version: 3.2\n    - name: Install dependencies\n      run: bundle install\n      working-directory: example/ruby\n    - name: Run tests\n      run: ruby example_sample2_ios.rb\n      working-directory: example/ruby\n\n    - name: Save server output\n      if: ${{ always() }}\n      uses: actions/upload-artifact@master\n      with:\n        name: appium-ios.log\n        path: driver/appium.log\n\n  android_test:\n    runs-on: ubuntu-latest\n\n    env:\n      API_LEVEL: 34\n      ARCH: x86_64\n\n    steps:\n    - uses: actions/checkout@v6\n\n    - uses: actions/setup-java@v5\n      with:\n        distribution: 'temurin'\n        java-version: '17'\n\n    - name: Install Node.js\n      uses: actions/setup-node@v6\n      with:\n        node-version: 'lts/*'\n\n    # Start Appium\n    - run: npm install -g appium\n    - run: |\n        npm install\n        nohup appium --log-timestamp --log-no-colors > appium.log &\n      working-directory:\n        driver\n\n    - name: Enable KVM group perms\n      run: |\n        echo 'KERNEL==\"kvm\", GROUP=\"kvm\", MODE=\"0666\", OPTIONS+=\"static_node=kvm\"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules\n        sudo udevadm control --reload-rules\n        sudo udevadm trigger --name-match=kvm\n\n    - name: AVD cache\n      uses: actions/cache@v5\n      id: avd-cache\n      with:\n        path: |\n          ~/.android/avd/*\n          ~/.android/adb*\n        key: avd-${{ env.API_LEVEL }}\n    - name: create AVD and generate snapshot for caching\n      if: steps.avd-cache.outputs.cache-hit != 'true'\n      uses: reactivecircus/android-emulator-runner@v2\n      with:\n        api-level: ${{ env.API_LEVEL }}\n        arch: ${{ env.ARCH }}\n        target: google_apis\n        force-avd-creation: false\n        emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none\n        disable-animations: false\n        script: echo \"Generated AVD snapshot for caching.\"\n\n    - name: Set up Ruby\n      uses: ruby/setup-ruby@v1\n      with:\n        ruby-version: 3.2\n    - name: Install dependencies\n      run: bundle install\n      working-directory: example/ruby\n\n    - name: Run tests\n      uses: reactivecircus/android-emulator-runner@v2\n      with:\n        api-level: ${{ env.API_LEVEL }}\n        arch: ${{ env.ARCH }}\n        script: ruby example/ruby/example_sample2.rb\n        target: google_apis\n        profile: Nexus 5X\n        disable-spellchecker: true\n        disable-animations: true\n      env:\n        ANDROID_SDK_VERSION: ${{ env.API_LEVEL }}\n        APPIUM_DRIVER: ${{matrix.test_targets.automation_name}}\n        IGNORE_VERSION_SKIP: true\n        CI: true\n\n    - name: Save server output\n      if: ${{ always() }}\n      uses: actions/upload-artifact@master\n      with:\n        name: appium-android.log\n        path: driver/appium.log\n"
  },
  {
    "path": ".github/workflows/finder-kotlin.yml",
    "content": "name: Kotlin\n\non:\n  workflow_dispatch:\n  push:\n    paths:\n      - 'finder/kotlin/**'\n    branches: [ main ]\n  pull_request:\n    paths:\n      - 'finder/kotlin/**'\n    branches: [ main ]\n\npermissions:\n  contents: read\n\njobs:\n  build:\n\n    runs-on: ubuntu-latest\n\n    steps:\n    - uses: actions/checkout@v6\n    - name: Set up JDK 11\n      uses: actions/setup-java@v5\n      with:\n        java-version: '11'\n        distribution: 'temurin'\n    - name: Run tests\n      run: ./gradlew test\n      working-directory: finder/kotlin\n"
  },
  {
    "path": ".github/workflows/finder-node.js.yml",
    "content": "# This workflow will do a clean install of node dependencies, cache/restore them, build the source code and run tests across different versions of node\n# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions\n\nname: Finer for NodeJS\n\non:\n  workflow_dispatch:\n  push:\n    branches: [ main ]\n    paths:\n      - 'finder/nodejs/**'\n  pull_request:\n    branches: [ main ]\n    paths:\n      - 'finder/nodejs/**'\n\njobs:\n  prepare_matrix:\n    runs-on: ubuntu-latest\n    outputs:\n      versions: ${{ steps.generate-matrix.outputs.versions }}\n    steps:\n    - name: Select 3 most recent LTS versions of Node.js\n      id: generate-matrix\n      run: echo \"versions=$(curl -s https://endoflife.date/api/nodejs.json | jq -c '[[.[] | select(.lts != false)][:3] | .[].cycle | tonumber]')\" >> \"$GITHUB_OUTPUT\"\n\n  build:\n    needs:\n    - prepare_matrix\n\n    runs-on: ubuntu-latest\n\n    strategy:\n      matrix:\n        node-version:  ${{ fromJSON(needs.prepare_matrix.outputs.versions) }}\n        # See supported Node.js release schedule at https://nodejs.org/en/about/releases/\n\n    steps:\n    - uses: actions/checkout@v6\n    - name: Use Node.js ${{ matrix.node-version }}\n      uses: actions/setup-node@v6\n      with:\n        node-version: ${{ matrix.node-version }}\n    - run: |\n        npm install\n        npm run lint\n        npm run test\n      working-directory: finder/nodejs\n"
  },
  {
    "path": ".github/workflows/finder-python.yml",
    "content": "name: Python\n\non:\n  workflow_dispatch:\n  push:\n    paths:\n      - 'finder/python/**'\n    branches: [ main ]\n  pull_request:\n    paths:\n      - 'finder/python/**'\n    branches: [ main ]\n\njobs:\n  build:\n\n    runs-on: ubuntu-latest\n\n    strategy:\n      matrix:\n        python-version: ['3.9', '3.10', '3.11', '3.12', '3.13']\n\n    steps:\n    - uses: actions/checkout@v6\n    - name: Set up Python ${{ matrix.python-version }}\n      uses: actions/setup-python@v6\n      with:\n        python-version: ${{ matrix.python-version }}\n    - name: Install dependencies\n      run: |\n        python -m pip install --upgrade pip\n        pip install pylint pytest Appium-Python-Client\n    - name: Analyzing the code with pylint\n      run: pylint tests/ appium_flutter_finder/\n      working-directory: finder/python\n    - name: Run tests\n      run: pytest tests/**\n      working-directory: finder/python\n"
  },
  {
    "path": ".github/workflows/finder-ruby.yml",
    "content": "# This workflow uses actions that are not certified by GitHub.\n# They are provided by a third-party and are governed by\n# separate terms of service, privacy policy, and support\n# documentation.\n# This workflow will download a prebuilt Ruby version, install dependencies and run tests with Rake\n# For more information see: https://github.com/marketplace/actions/setup-ruby-jruby-and-truffleruby\n\nname: Ruby\n\non:\n  workflow_dispatch:\n  push:\n    paths:\n      - 'finder/ruby/**'\n    branches: [ main ]\n  pull_request:\n    paths:\n      - 'finder/ruby/**'\n    branches: [ main ]\n\njobs:\n  test:\n\n    runs-on: ubuntu-latest\n    strategy:\n      matrix:\n        ruby-version: ['3.1', '3.2', '3.3']\n\n    steps:\n    - uses: actions/checkout@v6\n    - name: Set up Ruby\n      uses: ruby/setup-ruby@v1\n      with:\n        ruby-version: ${{ matrix.ruby-version }}\n        bundler-cache: true\n        working-directory: finder/ruby\n    - name: Run tests\n      run: bundle exec rake\n      working-directory: finder/ruby\n"
  },
  {
    "path": ".github/workflows/nodejs.yml",
    "content": "# This workflow will do a clean install of node dependencies, cache/restore them, build the source code and run tests across different versions of node\n# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions\n\nname: Node.js CI\n\non:\n  workflow_dispatch:\n  push:\n    paths:\n      - 'driver/**'\n    branches: [ main ]\n  pull_request:\n    paths:\n      - 'driver/**'\n    branches: [ main ]\n\njobs:\n  node_matrix:\n    uses: appium/appium-workflows/.github/workflows/node-lts-matrix.yml@main\n\n  build:\n    needs:\n    - node_matrix\n\n    runs-on: ubuntu-latest\n\n    strategy:\n      fail-fast: false\n      matrix:\n        node-version: ${{ fromJSON(needs.node_matrix.outputs.versions) }}\n        # See supported Node.js release schedule at https://nodejs.org/en/about/releases/\n\n    steps:\n    - uses: actions/checkout@v6\n    - name: Use Node.js ${{ matrix.node-version }}\n      uses: actions/setup-node@v6\n      with:\n        node-version: ${{ matrix.node-version }}\n    - run: |\n        npm install\n        npm run lint\n        npm run format:check\n      working-directory: driver\n"
  },
  {
    "path": ".github/workflows/publish.yml",
    "content": "# This workflow will run tests using node and then publish a package to GitHub Packages when a release is created\n# For more information see: https://docs.github.com/en/actions/publishing-packages/publishing-nodejs-packages\n\nname: publish driver\n\n# FIXME\n# npm token kep raising as invalid while it had proper one.\non:\n  workflow_dispatch:\n#  push:\n#    branches: [ main ]\n#    # paths:\n#    #   - 'driver/**'\n\npermissions:\n  contents: write\n  pull-requests: write\n  issues: write\n  id-token: write # to enable use of OIDC for trusted publishing and npm provenance\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v6\n      - uses: actions/setup-node@v6\n        with:\n          node-version: lts/*\n          check-latest: true\n      - run: npm install\n        working-directory: driver\n      - run: npm test\n        working-directory: driver\n\n  publish-npm:\n    needs: build\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v6\n        with:\n          fetch-depth: 2\n      - uses: actions/setup-node@v6\n        with:\n          node-version: lts/*\n          check-latest: true\n      - run: npm install\n        working-directory: driver\n      - run: npm publish\n        name: Publish the package\n        working-directory: driver\n"
  },
  {
    "path": ".gitignore",
    "content": ".DS_Store\n\n# Logs\nlogs\n*.log\nnpm-debug.log*\npackage-lock.json*\n\n# Runtime data\npids\n*.pid\n*.seed\n\n# Directory for instrumented libs generated by jscoverage/JSCover\nlib-cov\n\n# Coverage directory used by tools like istanbul\ncoverage\n\n# nyc test coverage\n.nyc_output\n\n# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)\n.grunt\n\n# node-waf configuration\n.lock-wscript\n\n# Compiled binary addons (http://nodejs.org/api/addons.html)\nbuild/Release\n\n# Dependency directories\nnode_modules\njspm_packages\n\n# Optional npm cache directory\n.npm\n\n# Optional REPL history\n.node_repl_history\n\n# Ignore gulped JS\nbuild\n\n# Pack output\n*.tgz\n\n# python\nfinder/python/build\nfinder/python/dist\nfinder/python/Appium_Flutter_Finder.egg-info\n\n#dotnet\n.vs/\nbin/\nobj/\n"
  },
  {
    "path": ".vscode/launch.json",
    "content": "{\n  // Use IntelliSense to learn about possible attributes.\n  // Hover to view descriptions of existing attributes.\n  // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387\n  \"version\": \"0.2.0\",\n  \"configurations\": [\n    {\n      \"type\": \"node\",\n      \"request\": \"launch\",\n      \"name\": \"Run test iOS\",\n      \"env\": {\n        \"APPIUM_OS\": \"ios\"\n      },\n      \"program\": \"${workspaceFolder}/example/src/index.js\",\n      \"outFiles\": [\n        \"${workspaceFolder}/**/*.js\"\n      ]\n    },\n    {\n      \"type\": \"node\",\n      \"request\": \"launch\",\n      \"name\": \"Run test Android\",\n      \"env\": {\n        \"APPIUM_OS\": \"android\"\n      },\n      \"program\": \"${workspaceFolder}/example/src/index.js\",\n      \"outFiles\": [\n        \"${workspaceFolder}/**/*.js\"\n      ]\n    }\n  ]\n}"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n-----------\n\nCopyright (c) 2019 TruongSinh Tran-Nguyen <i@truongsinh.pro>\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "# Appium Flutter Driver\n\n[![NPM version](https://img.shields.io/npm/v/appium-flutter-driver.svg)](https://npmjs.org/package/appium-flutter-driver)\n[![Downloads](https://img.shields.io/npm/dm/appium-flutter-driver.svg)](https://npmjs.org/package/appium-flutter-driver)\n\nAppium Flutter Driver is a test automation tool for [Flutter](https://flutter.dev) apps on multiple platforms/OSes. Appium Flutter Driver is part of the [Appium](https://github.com/appium/appium) mobile test automation tool maintained by the community. Feel free to create PRs to fix issues/improve this driver.\n\n## Flutter Driver vs Appium Flutter Driver\nEven though Flutter comes with superb integration test support, [Flutter Driver](https://flutter.dev/docs/cookbook/testing/integration/introduction), it does not fit some specific use cases, such as\n- Writing tests in other languages than Dart\n- Running integration test for Flutter app with embedded webview or native view, or existing native app with embedded Flutter view\n- Running tests on multiple devices simultaneously\n- Running integration tests on device farms that offer Appium support (Please contact the availability for each vendor)\n\nUnder the hood, Appium Flutter Driver uses the [Dart VM Service Protocol](https://github.com/dart-lang/sdk/blob/master/runtime/vm/service/service.md) with extension `ext.flutter.driver`, similar to Flutter Driver, to control the Flutter app-under-test (AUT).\n\n## Appium drivers for Flutter\n\nAppium community currently has two drivers for Flutter environment:\n\n- Appium Flutter driver (this driver)\n    - Run Flutter commands over websocket connection against the observaory URL (calls Flutter APIs directly)\n    - Base APIs are [`flutter_driver`](https://api.flutter.dev/flutter/flutter_driver/flutter_driver-library.html)\n- [`Appium Flutter Integration Driver`](https://github.com/AppiumTestDistribution/appium-flutter-integration-driver)\n    - Run a server on DartVM as part of the application under test in order to call Flutter APIs via the server\n    - Base APIs are [`integration_test`](https://github.com/flutter/flutter/tree/main/packages/integration_test#integration_test)\n\n## Appium Flutter Driver or Appium UiAutomator2/XCUITest driver\n\nAs a baseline, we recommend using [official testing tools and strategy](https://docs.flutter.dev/testing/overview) to test Flutter apps as possible in Dart.\n\nIf you'd like to test a release app, which can be released from app store as-is, Appium [UIAutomator2](https://github.com/appium/appium-uiautomator2-driver)/[XCUITest](https://github.com/appium/appium-xcuitest-driver) driver is a good choice. Since Flutter 3.19, Flutter apps can expose [`identifier` for `SemanticsProperties`](https://api.flutter.dev/flutter/semantics/SemanticsProperties/identifier.html) as `resource-id` in Android and `accessibilityIdentifier` in iOS. They should help to achieve automation against release apps with Appium [UIAutomator2](https://github.com/appium/appium-uiautomator2-driver)/[XCUITest](https://github.com/appium/appium-xcuitest-driver) as blackbox testing.\n\n- Appium Flutter driver has three contexts to manage the application under test and the device under test. To achieve the `FLUTTER` context, the test package requires testing tools to import. The application under test cannot release as-is.\n    - `FLUTTER` context sends commands to the Dart VM directly over the observatory URL. This allows you to interact with Flutter elements directly.\n    - `NATIVE_APP` context is the same as the regular Appium [UIAutomator2](https://github.com/appium/appium-uiautomator2-driver)/[XCUITest](https://github.com/appium/appium-xcuitest-driver) driver\n    - `WEBVIEW` context manages the WebView contents over Appium UiAutomator2/XCUITest driver\n- (**Recommended** if possible) Appium [UIAutomator2](https://github.com/appium/appium-uiautomator2-driver)/[XCUITest](https://github.com/appium/appium-xcuitest-driver) driver directly must be sufficient to achieve automation if the application under test had `semanticLabel` properly. Then, the accessibility mechanism in each OS can expose elements for Appium through OS's accessibility features.\n    - In addition to `semanticLabel`, Flutter 3.19+ may have [`identifier` for `SemanticsProperties`](https://api.flutter.dev/flutter/semantics/SemanticsProperties/identifier.html) (introduced by https://github.com/flutter/flutter/pull/138331). It sets `resource-id` and `accessibilityIdentifier` for Android and iOS, then UiAutomator2/XCUITest drivers might also be able to interact with these elements without Appium Flutter Driver.\n        - `\"appium:settings[disableIdLocatorAutocompletion]\": true` or configuring `disableIdLocatorAutocompletion` via [Settings API](https://appium.io/docs/en/latest/guides/settings/) would be necessary to make `resource-id` idea work without any package name prefix like Android compose.\n        - e.g. https://github.com/flutter/flutter/issues/17988#issuecomment-1867097631\n\n## Installation\n\nAppium Flutter Driver version `3.0.0` requires Appium 3.\n\n```\nappium driver install --source=npm appium-flutter-driver\n```\n\nAs a local:\n\n```\nappium driver install --source local /path/to/appium-flutter-driver/driver\n```\n\n## Usage and requirement\nIf you are unfamiliar with running Appium tests, start with [Quickstart Intro](https://appium.io/docs/en/latest/quickstart/) first.\n\nYour Flutter application must be compiled in `debug` or `profile` mode. The dependency must have **[`flutter_driver`](https://api.flutter.dev/flutter/flutter_driver/flutter_driver-library.html)** package like the below `pubspec.yaml` example with [`enableFlutterDriverExtension`](https://api.flutter.dev/flutter/flutter_driver_extension/flutter_driver_extension-library.html) configuration in the `main.dart`.\n\n```yaml\n# pubspec.yaml\ndev_dependencies:\n  flutter_driver:\n    sdk: flutter\n```\n\nThis snippet, taken from [example directory](example), is a script written as an appium client with `webdriverio`, and assumes you have `appium` server (with `appium-flutter-driver` installed) running on the same host and default port (`4723`). For more info, see example's [README.md](https://github.com/appium/appium-flutter-driver/tree/main/example/nodejs/README.md)\n\n> **Note**\n>\n> This means this driver depends on [`flutter_driver`](https://api.flutter.dev/flutter/flutter_driver/flutter_driver-library.html).\n> In the past, the Flutter team announced replacing `flutter_driver` with `integration_test`, but according to [this ticket](https://github.com/flutter/flutter/issues/148028), this discussion is still ongoing.\n> So flutter_driver would continue to be maintained for now.\n\nEach client needs [each finder](finder) module to handle [Finders](#Finders). Appium Flutter Driver communicates with the Dart VM directory in the `FLUTTER` context.\n\n### Doctor\nSince driver version 2.4.0 you can automate the validation for the most of the above requirements as well as various optional ones needed by driver extensions by running the `appium driver doctor flutter` server command.\nThe check runs for Android for UIAutomator2 driver and iOS for XCUITest driver.\n\n`SKIP_ANDROID` or `SKIP_IOS` environment variable helps to skip these checks.\n\n```\n# skip Android check\nSKIP_ANDROID=1 appium driver doctor flutter\n# skip iOS check\nSKIP_IOS=1 appium driver doctor flutter\n```\n\n### Note\n- Flutter context does not support page source\n    - Please use `getRenderTree` command instead\n- You can send appium-xcuitest-driver/appium-uiautomator2-driver commands in `NATIVE_APP` context\n- `scrollUntilVisible` command : An expectation for checking that an element, known to be present on the widget tree, is visible. Using waitFor to wait element\n- `scrollUntilTapable` command : An expectation for checking an element is visible and enabled such that you can click it. Using waitTapable to wait element\n- `driver.activateApp(appId)` starts the given app and attaches to the observatory URL in the `FLUTTER` context. The method may raise an exception if no observaotry URL was found. The typical case is the `appId` is already running. Then, the driver will fail to find the observatory URL.\n- `getClipboard` and `setClipboard` depend on each `NATIVE_APP` context behavior\n- Launch via `flutter:launchApp` or 3rd party tool (via instrument service) and attach to the Dart VM for an iOS real device (profile build)\n    1. Do not set `app` nor `bundleId` to start a session without launching apps\n    2. Start the app process via 3rd party tools such as [go-ios](https://github.com/danielpaulus/go-ios) to start the app process with debug mode in the middle of the new session process in 1) the above.\n          - Then, the appium flutter session establish the WebSocket and proceed the session\n- keyboard interaction may not work in Android because of https://github.com/flutter/flutter/issues/15415 that is caused by [`flutter_driver`](https://api.flutter.dev/flutter/flutter_driver/flutter_driver-library.html)\n\n## Capabilities\n\n### For the Appium Flutter Driver only\n\n| Capability | Description | Example Values |\n| - | - | -|\n| appium:retryBackoffTime | The interval to find the observetory url from logs. (default 3000ms)|500|\n| appium:maxRetryCount    | The count to find the observatory url. (default 10)          | 20|\n| appium:observatoryWsUri | The URL to attach to the Dart VM. The Appium Flutter Driver finds the WebSocket URL from the device log by default. You can skip the finding the URL process by specifying this capability. Then, this driver attempt to establish a WebSocket connection against the given WebSocket URL. Note that this capability expects the URL is ready for access by outside an appium session. This flutter driver does not do port-forwarding with this capability. You may need to coordinate the port-forwarding as well. | 'ws://127.0.0.1:60992/aaaaaaaaaaa=/ws' |\n| appium:isolateId | The isolate id to attach to as the initial attempt. A session can change the isolate with `flutter:setIsolateId` command. The default behavior finds `main` isolate id and attaches it. | `isolates/2978358234363215`, `2978358234363215` |\n| appium:skipPortForward | Whether skip port forwarding from the flutter driver local to the device under test with `observatoryWsUri` capability. It helps you to manage the application under test, the observatory URL and the port forwarding configuration. The default is `true`. | true, false |\n| appium:remoteAdbHost | The IP/hostname of the remote host ADB is running on. This capability only makes sense for Android platform. Providing it will implicitly override the host for the Observatory URL if the latter is determined from device logs. localhost be default | 192.168.1.20\n| appium:adbPort | The port number ADB server is running on. This capability only makes sense for Android platform. 5037 by default | 9999\n| appium:forwardingPort | The port number that will be used to forward the traffic from the device under test to localhost. Only applicable if `skipPortForward` is falsy. Not applicable if the test is executed on iOS Simulator. By default, it is the same as in the provided or autodetected Observatory URL. | 9999\n\n### UIA2/XCUITest driver\n\nPlease check each driver's documentation\n- https://github.com/appium/appium-uiautomator2-driver\n- https://appium.github.io/appium-xcuitest-driver/latest/capabilities/\n\n## Context Management\n\nAppium Flutter Driver allows you to send [`flutter_driver`](https://api.flutter.dev/flutter/flutter_driver/flutter_driver-library.html) commands to the Dart VM in the `FLUTTER` context, but it does not support native Android/iOS since the Dart VM can handle in the Dart VM contents. `NATIVE_APP` context provides you to use the UIA2 driver for Android and the XCUITest driver for iOS automation. `WEBVIEW_XXXX` context helps WebView testing over the UIA2/XCUITest driver that is not available via the flutter_driver.\n\nThus, you need to switch proper contexts, `FLUTTER`, `NATIVE_APP` or `WEBVIEW_XXXX`, to automate a proper application target.\n\n### Example\n\n```js\n# webdriverio\nconst wdio = require('webdriverio');\nconst assert = require('assert');\nconst { byValueKey } = require('appium-flutter-finder');\n\nconst osSpecificOps = process.env.APPIUM_OS === 'android' ? {\n  'platformName': 'Android',\n  'appium:deviceName': 'Pixel 2',\n  'appium:app': __dirname +  '/../apps/app-free-debug.apk',\n}: process.env.APPIUM_OS === 'ios' ? {\n  'platformName': 'iOS',\n  'appium:platformVersion': '12.2',\n  'appium:deviceName': 'iPhone X',\n  'appium:noReset': true,\n  'appium:app': __dirname +  '/../apps/Runner.zip',\n} : {};\n\nconst opts = {\n  port: 4723,\n  capabilities: {\n    ...osSpecificOps,\n    'appium:automationName': 'Flutter',\n    'appium:retryBackoffTime': 500\n  }\n};\n\n(async () => {\n  const counterTextFinder = byValueKey('counter');\n  const buttonFinder = byValueKey('increment');\n\n  const driver = await wdio.remote(opts);\n\n  if (process.env.APPIUM_OS === 'android') {\n    await driver.switchContext('NATIVE_APP');\n    await (await driver.$('~fab')).click();\n    await driver.switchContext('FLUTTER');\n  } else {\n    console.log('Switching context to `NATIVE_APP` is currently only applicable to Android demo app.')\n  }\n\n  assert.strictEqual(await driver.getElementText(counterTextFinder), '0');\n\n  await driver.elementClick(buttonFinder);\n  await driver.touchAction({\n    action: 'tap',\n    element: { elementId: buttonFinder }\n  });\n\n  assert.strictEqual(await driver.getElementText(counterTextFinder), '2');\n\n  driver.deleteSession();\n})();\n```\n\nPlease check [example](example) in this repository for more languages.\n\n## Several ways to start an application\n\nYou have a couple of methods to start the application under test by establishing the Dart VM connection as below:\n\n1. Start with `app` in the capabilities\n    1. The most standard method. You may need to start a new session with `app` capability. Then, appium-flutter-driver will start the app, and establish a connection with the Dart VM immediately.\n2. Start with `activate_app`: for users who want to start the application under test in the middle of a session\n    1. Start a session without `app` capability\n    2. Install the application under test via `driver.install_app` or `mobile:installApp` command\n    3. Activate the app via `driver.activate_app` or `mobile:activateApp` command\n        - Then, appium-flutter-driver establish a connection with the Dart VM\n3. Launch the app outside the driver: for users who want to manage the application under test by yourselves\n    1. Start a session without `app` capability\n    2. Install the application under test via `driver.install_app` or `mobile:installApp` command etc\n    3. Calls `flutter:connectObservatoryWsUrl` command to keep finding an observatory URL to the Dart VM\n    4. (at the same time) Launch the application under test via outside the appium-flutter-driver\n        - e.g. Launch an iOS process via [ios-go](https://github.com/danielpaulus/go-ios), [iproxy](https://github.com/libimobiledevice/libusbmuxd#iproxy) or [tidevice](https://github.com/alibaba/taobao-iphone-device)\n    5. Once `flutter:connectObservatoryWsUrl` identify the observatory URL, the command will establish a connection to the Dart VM\n4. Launch the app with `flutter:launchApp` for iOS and attach to the Dart VM: for users whom application under test do not print the observatory url via regular launch/activate app method\n    1. Start a session without `app` capability\n    2. Install the application under test via `driver.install_app` or `mobile:installApp` command etc\n    3. Calls `flutter:launchApp` command to start an iOS app via instrument service\n        - `driver.execute_script 'flutter:launchApp', 'com.example.bundleId', {arguments: ['arg1'], environment: {ENV1: 'env'}}` is example usage\n        - This launching method is the same as the above 3rd party method, but does the same thing only via the appium flutter driver.\n\nPlease make sure the target app process stops before starting the target app with the above.\n\n## Changelog\n\n- [appium-flutter-driver](driver/CHANGELOG.md)\n- [each finder](finder)\n\n\n## Commands for NATIVE_APP/WEBVIEW context\n\nPlease check each driver's documentation\n- https://github.com/appium/appium-uiautomator2-driver\n- https://appium.github.io/appium-xcuitest-driver/latest\n\n## Commands for FLUTTER context\n\nLegend:\n\n| Icon | Description |\n| - | - |\n| :white_check_mark: | integrated to CI |\n| :ok: | manual tested without CI |\n| :warning: | available without manual tested |\n| :x: | unavailable |\n\n### Finders\n\n| Flutter Driver API | Status | WebDriver example |\n| - | - | - |\n| [ancestor](https://api.flutter.dev/flutter/flutter_driver/CommonFinders/ancestor.html) | :ok: |  |\n| [bySemanticsLabel](https://api.flutter.dev/flutter/flutter_driver/CommonFinders/bySemanticsLabel.html) | :ok: |  |\n| [byTooltip](https://api.flutter.dev/flutter/flutter_driver/CommonFinders/byTooltip.html) | :ok: | `byTooltip('Increment')` |\n| [byType](https://api.flutter.dev/flutter/flutter_driver/CommonFinders/byType.html) | :ok: | `byType('TextField')` |\n| [byValueKey](https://api.flutter.dev/flutter/flutter_driver/CommonFinders/byValueKey.html) | :ok: | [`byValueKey('counter')`](https://github.com/appium/appium-flutter-driver/blob/5df7386b59bb99008cb4cff262552c7259bb2af2/example/src/index.js#L30) |\n| [descendant](https://api.flutter.dev/flutter/flutter_driver/CommonFinders/descendant.html) | :ok: |  |\n| [pageBack](https://api.flutter.dev/flutter/flutter_driver/CommonFinders/pageBack.html) | :ok: | `pageBack()` |\n| [text](https://api.flutter.dev/flutter/flutter_driver/CommonFinders/text.html) | :ok: | `byText('foo')` |\n\n### Commands\n\nThe below _WebDriver example_ is by webdriverio.\n`flutter:` prefix commands are [`mobile:` command in appium for Android and iOS](https://appium.io/docs/en/latest/guides/execute-methods/).\nPlease replace them properly with your client.\n\n| Flutter API                                                                                                                        | Status | WebDriver example (JavaScript, webdriverio) | Scope             |\n|------------------------------------------------------------------------------------------------------------------------------------| - | - |-------------------|\n| [FlutterDriver.connectedTo](https://api.flutter.dev/flutter/flutter_driver/FlutterDriver/FlutterDriver.connectedTo.html)           | :ok: | [`wdio.remote(opts)`](https://github.com/appium/appium-flutter-driver/blob/5df7386b59bb99008cb4cff262552c7259bb2af2/example/src/index.js#L33) | Session           |\n| [checkHealth](https://api.flutter.dev/flutter/flutter_driver/FlutterDriver/checkHealth.html)                                       | :ok: | `driver.execute('flutter:checkHealth')` | Session           |\n| clearTextbox                                                                                                                       | :ok: | `driver.elementClear(find.byType('TextField'))` | Session           |\n| [clearTimeline](https://api.flutter.dev/flutter/flutter_driver/FlutterDriver/clearTimeline.html)                                   | :ok: | `driver.execute('flutter:clearTimeline')` | Session           |\n| [enterText](https://api.flutter.dev/flutter/flutter_driver/FlutterDriver/enterText.html)                                           | :ok: | `driver.elementSendKeys(find.byType('TextField'), 'I can enter text')` (no focus required) <br/> `driver.elementClick(find.byType('TextField')); driver.execute('flutter:enterText', 'I can enter text')` (focus required by tap/click first) | Session           |\n| [forceGC](https://api.flutter.dev/flutter/flutter_driver/FlutterDriver/forceGC.html)                                               | :ok: | `driver.execute('flutter:forceGC')` | Session           |\n| [getBottomLeft](https://api.flutter.dev/flutter/flutter_driver/FlutterDriver/getBottomLeft.html)                                   | :ok: | `driver.execute('flutter:getBottomLeft', buttonFinder)` | Widget            |\n| [getBottomRight](https://api.flutter.dev/flutter/flutter_driver/FlutterDriver/getBottomRight.html)                                 | :ok: | `driver.execute('flutter:getBottomRight', buttonFinder)` | Widget            |\n| [getCenter](https://api.flutter.dev/flutter/flutter_driver/FlutterDriver/getCenter.html)                                           | :ok: | `driver.execute('flutter:getCenter', buttonFinder)` | Widget            |\n| [getRenderObjectDiagnostics](https://api.flutter.dev/flutter/flutter_driver/FlutterDriver/getRenderObjectDiagnostics.html)         | :ok: | `driver.execute('flutter:getRenderObjectDiagnostics', counterTextFinder, { includeProperties: true, subtreeDepth: 2 })` | Widget            |\n| [getWidgetDiagnostics](https://api.flutter.dev/flutter/flutter_driver/FlutterDriver/getWidgetDiagnostics.html)                     | :ok: (v2.8.0+) | `driver.execute('flutter:getWidgetDiagnostics', counterTextFinder, { includeProperties: true, subtreeDepth: 2 })` | Widget            |\n| [getRenderTree](https://api.flutter.dev/flutter/flutter_driver/FlutterDriver/getRenderTree.html)                                   | :ok: | `driver.execute('flutter: getRenderTree')` | Session           |\n| [getSemanticsId](https://api.flutter.dev/flutter/flutter_driver/FlutterDriver/getSemanticsId.html)                                 | :ok: | `driver.execute('flutter:getSemanticsId', counterTextFinder)` | Widget            |\n| [getText](https://api.flutter.dev/flutter/flutter_driver/FlutterDriver/getText.html)                                               | :ok: | [`driver.getElementText(counterTextFinder)`](https://github.com/appium/appium-flutter-driver/blob/5df7386b59bb99008cb4cff262552c7259bb2af2/example/src/index.js#L44) | Widget            |\n| [getTopLeft](https://api.flutter.dev/flutter/flutter_driver/FlutterDriver/getTopLeft.html)                                         | :ok: | `driver.execute('flutter:getTopLeft', buttonFinder)` | Widget            |\n| [getTopRight](https://api.flutter.dev/flutter/flutter_driver/FlutterDriver/getTopRight.html)                                       | :ok: | `driver.execute('flutter:getTopRight', buttonFinder)` | Widget            |\n| [getVmFlags](https://api.flutter.dev/flutter/flutter_driver/FlutterDriver/getVmFlags.html)                                         | :x: |  | Session           |\n| [requestData](https://api.flutter.dev/flutter/flutter_driver/FlutterDriver/requestData.html)                                       | :ok: | `driver.execute('flutter:requestData', json.dumps({\"deepLink\": \"myapp://item/id1\"}))`  | Session           |\n| [runUnsynchronized](https://api.flutter.dev/flutter/flutter_driver/FlutterDriver/runUnsynchronized.html)                           | :x: |  | Session           |\n| [setFrameSync](https://api.flutter.dev/flutter/flutter_driver/SetFrameSync-class.html)                                             |:ok:| `driver.execute('flutter:setFrameSync', bool , durationMilliseconds)`| Session           |\n| [screenshot](https://api.flutter.dev/flutter/flutter_driver/FlutterDriver/screenshot.html)                                         | :ok: | `driver.takeScreenshot()` | Session           |\n| [screenshot](https://api.flutter.dev/flutter/flutter_driver/FlutterDriver/screenshot.html)                                         | :ok: | `driver.saveScreenshot('a.png')` | Session           |\n| [scroll](https://api.flutter.dev/flutter/flutter_driver/FlutterDriver/scroll.html)                                                 | :ok: | `driver.execute('flutter:scroll', find.byType('ListView'), {dx: 50, dy: -100, durationMilliseconds: 200, frequency: 30})` | Widget            |\n| [scrollIntoView](https://api.flutter.dev/flutter/flutter_driver/FlutterDriver/scrollIntoView.html)                                 | :ok: | `driver.execute('flutter:scrollIntoView', find.byType('TextField'), {alignment: 0.1})` <br/> `driver.execute('flutter:scrollIntoView', find.byType('TextField'), {alignment: 0.1, timeout: 30000})` | Widget            |\n| [scrollUntilVisible](https://api.flutter.dev/flutter/flutter_driver/FlutterDriver/scrollUntilVisible.html)                         | :ok: | `driver.execute('flutter:scrollUntilVisible', find.byType('ListView'), {item:find.byType('TextField'), dxScroll: 90, dyScroll: -400});`, `driver.execute('flutter:scrollUntilVisible', find.byType('ListView'), {item:find.byType('TextField'), dxScroll: 90, dyScroll: -400, waitTimeoutMilliseconds: 20000});` | Widget            |\n| [scrollUntilTapable](https://api.flutter.dev/flutter/flutter_driver/FlutterDriver/scrollUntilVisible.html)                         | :ok: | `driver.execute('flutter:scrollUntilTapable', find.byType('ListView'), {item:find.byType('TextField'), dxScroll: 90, dyScroll: -400});`, `driver.execute('flutter:scrollUntilTapable', find.byType('ListView'), {item:find.byType('TextField'), dxScroll: 90, dyScroll: -400, waitTimeoutMilliseconds: 20000});` | Widget            |\n| [setSemantics](https://api.flutter.dev/flutter/flutter_driver/FlutterDriver/setSemantics.html)                                     | :x: |  | Session           |\n| [setTextEntryEmulation](https://api.flutter.dev/flutter/flutter_driver/FlutterDriver/setTextEntryEmulation.html)                   | :ok: | `driver.execute('flutter:setTextEntryEmulation', false)` | Session           |\n| [startTracing](https://api.flutter.dev/flutter/flutter_driver/FlutterDriver/startTracing.html)                                     | :x: |  | Session           |\n| [stopTracingAndDownloadTimeline](https://api.flutter.dev/flutter/flutter_driver/FlutterDriver/stopTracingAndDownloadTimeline.html) | :x: |  | Session           |\n| [tap](https://api.flutter.dev/flutter/flutter_driver/FlutterDriver/tap.html)                                                       | :ok: | [`driver.elementClick(buttonFinder)`](https://github.com/appium/appium-flutter-driver/blob/5df7386b59bb99008cb4cff262552c7259bb2af2/example/src/index.js#L46) | Widget            |\n| [tap](https://api.flutter.dev/flutter/flutter_driver/FlutterDriver/tap.html)                                                       | :ok: | [`driver.touchAction({action: 'tap', element: {elementId: buttonFinder}})`](https://github.com/appium/appium-flutter-driver/blob/5df7386b59bb99008cb4cff262552c7259bb2af2/example/src/index.js#L47) | Widget            |\n| [tap](https://api.flutter.dev/flutter/flutter_driver/FlutterDriver/tap.html)                                                       | :ok: | [`driver.execute('flutter:clickElement', buttonFinder, {timeout:5000})`](https://github.com/appium/appium-flutter-driver/blob/5df7386b59bb99008cb4cff262552c7259bb2af2/example/src/index.js#L47) | Widget            |\n| [traceAction](https://api.flutter.dev/flutter/flutter_driver/FlutterDriver/traceAction.html)                                       | :x: |  | Session           |\n| [waitFor](https://api.flutter.dev/flutter/flutter_driver/FlutterDriver/waitFor.html)                                               | :ok: | `driver.execute('flutter:waitFor', buttonFinder, 100)` | Widget            |\n| [waitForAbsent](https://api.flutter.dev/flutter/flutter_driver/FlutterDriver/waitForAbsent.html)                                   | :ok: | `driver.execute('flutter:waitForAbsent', buttonFinder)` | Widget            |\n| [waitForTappable](https://api.flutter.dev/flutter/flutter_driver/FlutterDriver/waitForTappable.html)                               | :ok: | `driver.execute('flutter:waitForTappable', buttonFinder)` | Widget            |\n| [waitUntilNoTransientCallbacks](https://api.flutter.dev/flutter/flutter_driver/FlutterDriver/waitUntilNoTransientCallbacks.html)   | :x: |  | Widget            |\n| -                                                                                                                                  | :ok: | `driver.execute('flutter:getVMInfo')` | System            |\n| -                                                                                                                                  | :ok: | `driver.execute('flutter:setIsolateId', 'isolates/2978358234363215')` | System            |\n| -                                                                                                                                  | :ok: | `driver.execute('flutter:getIsolate', 'isolates/2978358234363215')` or `driver.execute('flutter:getIsolate')` | System            |\n| :question:                                                                                                                         | :ok: | `driver.execute('flutter:longTap', find.byValueKey('increment'), {durationMilliseconds: 10000, frequency: 30})` | Widget            |\n| :question:                                                                                                                         | :ok: | `driver.execute('flutter:waitForFirstFrame')` | Widget            |\n| -                                                                                                                                  | :ok: | (Ruby) `driver.execute_script 'flutter:connectObservatoryWsUrl'` | Flutter Driver    |\n| -                                                                                                                                  | :ok: | (Ruby) `driver.execute_script 'flutter:launchApp', 'bundleId', {arguments: ['arg1'], environment: {ENV1: 'env'}}` | Flutter Driver    |\n| dragAndDropWithCommandExtension                                                                                                    | :ok: | (Python) `driver.execute_script('flutter:dragAndDropWithCommandExtension', payload)` | Command Extension |\n\n# Flutter Visibility Assertions for Appium\n\nThis module extends the `appium-flutter-driver` with custom visibility-related commands using `driver.execute()`.\n\n## ✅ Supported Shortcut Commands\n\n| **Command**         | **Status** | **Example Usage**                                                                                                         | **Target** |\n|---------------------|------------|--------------------------------------------------------------------------------------------------------------------------|------------|\n| `assertVisible`     | ✅         | `driver.execute('flutter:assertVisible', { key: 'myKey' })`<br>`driver.execute('flutter:assertVisible', { text: 'Login' })` | Widget     |\n| `assertNotVisible`  | ✅         | `driver.execute('flutter:assertNotVisible', { key: 'hiddenWidget' })`                                                   | Widget     |\n| `assertTappable`    | ✅         | `driver.execute('flutter:assertTappable', { label: 'Submit' })`                                                          | Widget     |\n\n## 🔍 Input Formats\n\nEach assertion supports the following input formats:\n\n- `{ key: 'valueKey' }`\n- `{ text: 'Text on widget' }`\n- `{ label: 'Tooltip text' }`\n\nThese map to Flutter finders:\n- `byValueKey`\n- `byText`\n- `byTooltip`\n\n## 📦 Integration\n\nThese commands are typically invoked using a client helper method like:\n\n```ts\n// TypeScript\nawait assertVisible(driver, { key: 'submit_button' });\n```\n\nOr as a flutter command.\n\n```ruby\n# ruby\ndriver.execute_script 'flutter:assertVisible', {text: 'Tap me!'}, 10000\n\n# This is equivalent to\ntext_finder = by_text 'Tap me!'\ndriver.execute_script 'flutter:assertVisible', text_finder, 10000\n# or\ndriver.execute_script 'flutter:waitFor', text_finder, 10000\n```\n\n**NOTE**\n>`flutter:launchApp` launches an app via instrument service. `mobile:activateApp` and `driver.activate_app` are via XCTest API. They are a bit different.\n\n\n### `isolate` handling\n#### Change the flutter engine attach to\n\n1. Get available isolate ids\n    - `id` key in the value of `isolates` by `flutter:getVMInfo`\n2. Set the id via `setIsolateId`\n\n```ruby\n# ruby\ninfo = driver.execute_script 'flutter:getVMInfo'\n# Change the target engine to \"info['isolates'][0]['id']\"\ndriver.execute_script 'flutter:setIsolateId', info['isolates'][0]['id']\n```\n\n#### Check current isolate, or a particular isolate\n\n1. Get available isolates\n    - `driver.execute('flutter:getVMInfo').isolates` (JS)\n2. Get a particular isolate or current isolate\n    - Current isolate: `driver.execute('flutter:getIsolate')` (JS)\n    - Particular isolate: `driver.execute('flutter:getIsolate', 'isolates/2978358234363215')` (JS)\n\n## Commands across contexts\n\nThese Appium commands can work across context\n\n- `deleteSession`\n- `setContext`\n- `getCurrentContext`\n- `getContexts`\n- `activateApp('appId')`/`mobile:activateApp`\n    - `mobile:activateApp` has `skipAttachObservatoryUrl` key to not try to attach to an observatory url. e.g. `driver.execute_script 'mobile:activateApp', {skipAttachObservatoryUrl: true, appId: 'com.android.chrome'}`\n- `terminateApp('appId')`/`mobile:terminateApp`\n- `installApp(appPath, options)`\n- `getClipboard`\n- `setClipboard`\n\n## Command Extension (Flutter Driver)\n\nThis is a command extension for Flutter Driver, utilizing the [CommandExtension-class](https://api.flutter.dev/flutter/flutter_driver_extension/CommandExtension-class.html) within `ext.flutter.driver`\n\nAvailable commands:\n\n- `dragAndDropWithCommandExtension` – performs a drag-and-drop action on the screen by specifying the start and end coordinates and the action duration.\n- `getTextWithCommandExtension` - get text data from Text widget that contains TextSpan widgets.\n\n### How to use\n\nCopy the sample dart files to the `lib` folder of your project. Please note that you don't need to copy all files, just copy the file matched with the command you need.\n- dragAndDropWithCommandExtension: [drag_commands.dart](./example/dart/drag_commands.dart)\n- getTextWithCommandExtension: [get_text_command.dart](./example/dart/get_text_command.dart)\n\nThe entry point must include the `List<CommandExtension>?` commands argument in either `main.dart` or `test_main.dart` to properly handle the command extension.\n\n\n```dart\nimport 'drag_commands.dart';\nimport 'get_text_command.dart';\n\nvoid main() {\n  enableFlutterDriverExtension(\n      commands: [DragCommandExtension(), GetTextCommandExtension()]);\n  runApp(const MyApp());\n}\n```\n\n#### Simple examples in Python\n\n```python\n# Extended commands: flutter:dragAndDropWithCommandExtension\ncoord_item_1 = driver.execute_script(\"flutter:getCenter\", item_1)\ncoord_item_2 = driver.execute_script(\"flutter:getCenter\", item_2)\nstart_x = coord_item_1[\"dx\"]\nstart_y = coord_item_1[\"dy\"]\nend_y = coord_item_2[\"dy\"]\n\npayload = {\n    \"startX\": start_x,\n    \"startY\": start_y,\n    \"endX\": \"0\",\n    \"endY\": end_y,\n    \"duration\": \"15000\" # minimum 15000ms needed to drag n drop\n}\n\ndriver.execute_script(\"flutter:dragAndDropWithCommandExtension\", payload)\n\n# Extended commands: flutter:getTextWithCommandExtension\ntext_finder = finder.by_value_key('amount')\nget_text_payload = {\n    'findBy': text_finder,\n}\nresult = driver.execute_script('flutter:getTextWithCommandExtension', payload)\nprint(result)\n```\n\n#### Simple examples in nodejs\n\n```typescript\n// Extended commands: flutter:dragAndDropWithCommandExtension\nconst payload = {\n  \"startX\": \"100\",\n  \"startY\": \"100\",\n  \"endX\": \"100\",\n  \"endY\": \"600\",\n  \"duration\": \"15000\"\n}\nconst result = await driver.execute(\"flutter:dragAndDropWithCommandExtension\", payload);\nconsole.log(JSON.stringify(result));\n\n// Extended commands: flutter:getTextWithCommandExtension\nimport {byValueKey} from \"appium-flutter-finder\";\nconst payload = {\n    'findBy': byValueKey('amount'),\n  };\nconst getTextResult = await driver.execute('flutter:getTextWithCommandExtension', payload);\nconsole.log(JSON.stringify(getTextResult));\n\n```\n\nFor debugging or testing in other programming languages, you can use the APK available in this [repository](https://github.com/Alpaca00/command-driven-list) or build an IPA.\n\n\n## Troubleshooting\n\n- Input texts https://github.com/appium/appium-flutter-driver/issues/417\n- Looks hanging in `click` https://github.com/appium/appium-flutter-driver/issues/181#issuecomment-1323684510\n    - `flutter:setFrameSync` may help\n- `flutter:waitFor` would help to handle \"an element does not exist/is not enabled\" behavior. [example issue](https://github.com/appium/appium-flutter-driver/issues/693)\n- Appium Inspector does not work with FLUTTER context\n- `enableFlutterDriverExtension()` must be called before calling `WidgetsFlutterBinding.ensureInitialized` to avoid `Binding is already initialized to WidgetsFlutterBinding` error which could cause `\"ext.flutter.driver\" is not found in \"extensionRPCs\"` error. [issue](https://github.com/appium/appium-flutter-driver/issues/756)\n\n## TODO?\n\n- [ ] switching context between Flutter and [AndroidView](https://api.flutter.dev/flutter/widgets/AndroidView-class.html)\n- [ ] switching context between Flutter and [UiKitView](https://api.flutter.dev/flutter/widgets/UiKitView-class.html)\n- [ ] Web: `FLUTTER_WEB` context?\n- [ ] macOS: with https://github.com/appium/appium-mac2-driver\n- [ ] Windws?\n- [ ] Linux?\n\n## Release appium-flutter-driver\n\n```\n$ cd driver\n$ sh release.sh\n$ npm version <major|minor|patch>\n# update changelog\n$ git commit -am 'chore: bump version'\n$ git tag <version number> # e.g. git tag v0.0.32\n$ git push origin v0.0.32\n$ git push origin main\n$ npm publish\n```\n\n### Java implementation\n\n- https://github.com/appium/appium-flutter-driver/tree/main/finder/kotlin via jitpack\n- https://github.com/ashwithpoojary98/javaflutterfinder\n- https://github.com/5v1988/appium-flutter-client\n"
  },
  {
    "path": "driver/.eslintrc.json",
    "content": "{\n  \"extends\": [\"@appium/eslint-config-appium-ts\"]\n}\n"
  },
  {
    "path": "driver/.gitignore",
    "content": "# copy from parent dir\nLICENSE\nREADME.md\n"
  },
  {
    "path": "driver/.npmrc",
    "content": "package-lock=false"
  },
  {
    "path": "driver/.releaserc",
    "content": "\n{\n  \"plugins\": [\n    [\"@semantic-release/commit-analyzer\", {\n      \"preset\": \"angular\",\n      \"releaseRules\": [\n        {\"type\": \"chore\", \"release\": \"patch\"}\n      ]\n    }],\n    [\"@semantic-release/release-notes-generator\", {\n      \"preset\": \"conventionalcommits\",\n      \"presetConfig\": {\n        \"types\": [\n          {\"type\": \"feat\", \"section\": \"Features\"},\n          {\"type\": \"fix\", \"section\": \"Bug Fixes\"},\n          {\"type\": \"perf\", \"section\": \"Performance Improvements\"},\n          {\"type\": \"revert\", \"section\": \"Reverts\"},\n          {\"type\": \"chore\", \"section\": \"Miscellaneous Chores\", \"hidden\": true},\n          {\"type\": \"refactor\", \"section\": \"Code Refactoring\"},\n          {\"type\": \"docs\", \"section\": \"Documentation\", \"hidden\": true},\n          {\"type\": \"style\", \"section\": \"Styles\", \"hidden\": true},\n          {\"type\": \"test\", \"section\": \"Tests\", \"hidden\": true},\n          {\"type\": \"build\", \"section\": \"Build System\", \"hidden\": true},\n          {\"type\": \"ci\", \"section\": \"Continuous Integration\", \"hidden\": true}\n        ]\n      }\n    }],\n    [\"@semantic-release/changelog\", {\n      \"changelogFile\": \"CHANGELOG.md\"\n    }],\n    \"@semantic-release/npm\",\n    [\"@semantic-release/git\", {\n      \"assets\": [\"npm-shrinkwrap.json\", \"package.json\", \"CHANGELOG.md\"],\n      \"message\": \"chore(release): ${nextRelease.version} [skip ci]\\n\\n${nextRelease.notes}\"\n    }],\n    \"@semantic-release/github\"\n  ]\n}\n"
  },
  {
    "path": "driver/CHANGELOG.md",
    "content": "# Changelog\n\n## 3.6.0\n- Update Appium XCUITest driver dependency to 10.43.1\n- Update Appium UIAutomator2 driver dependency to 7.1.2\n\n## 3.5.0\n- Update Appium XCUITest driver dependency to 10.22.0\n- Update Appium UIAutomator2 driver dependency to 6.8.2\n- Apply formatter\n\n## 3.4.0\n- Update Appium XCUITest driver dependency to 10.18.2\n- Update Appium UIAutomator2 driver dependency to 6.7.15\n- Update asyncbox to 6.0.1\n\n## 3.3.0\n- Update Appium XCUITest driver dependency to 10.11.0\n- Update Appium UIAutomator2 driver dependency to 6.7.1\n\n## 3.2.0\n- Fix log finding retry handling\n- Update Appium XCUITest driver dependency to 10.4.3\n- Update Appium UIAutomator2 driver dependency to 6.1.0\n\n## 3.1.0\n- Update Appium UIAutomator2 driver dependency to 6.0.2\n\n## 3.0.1\n- Fix types\n- Update Appium XCUITest driver dependency to 10.0.1\n- Update Appium UIAutomator2 driver dependency to 5.0.3\n\n## 3.0.0\n- Update Appium UIAutomator2 driver dependency to 5.0.0\n- Update Appium XCUITest driver dependency to 10.0.0\n- Follow Appium 3\n    - Required Node.js version has been bumped to ^20.19.0 || ^22.12.0 || >=24.0.0\n    - Required npm version has been bumped to >=10\n    - Requires **Appium 3.0.0+**\n\n## 2.19.0\n- Update Appium UIAutomator2 driver dependency to 4.2.9\n- Update Appium XCUITest driver dependency to 9.10.5\n\n## 2.18.1/2.18.0\n- Update Appium UIAutomator2 driver dependency to 4.2.4\n- Update Appium XCUITest driver dependency to 9.9.1\n    - Supports `appium driver run flutter download-wda-sim` command. It requires NodeJS 20+.\n\n## 2.17.0\n- Fix ending forwarding port with `forwardingPort` capability on iOS with `terminateApp`\n- Update Appium XCUITest driver dependency to 9.6.1\n\n## 2.16.0\n- Added shortcut commands below. Please check the README about the usage.\n    - `flutter:assertVisible`\n    - `flutter:assertNotVisible`\n    - `flutter:assertTappable`\n- Update Appium XCUITest driver dependency to 9.2.5\n\n## 2.15.2\n- Fix device orientation change for iOS\n- Update Appium XCUITest driver dependency to 9.2.4\n\n## 2.15.1\n- Add a retry logic to check `ext.flutter.driver` module existence\n\n## 2.15.0\n- Update Appium UIAutomator2 driver dependency to 4.2.3\n- Update Appium XCUITest driver dependency to 9.2.3\n\n## 2.14.2\n- Fix package to include npm-shrinkwrap.json explicitly\n- Update Appium UIAutomator2 driver dependency to 4.1.1\n- Update Appium XCUITest driver dependency to 8.4.1\n\n## 2.14.1\n- Fix lint\n\n## 2.14.0\n- Update Appium UIAutomator2 driver dependency to 4.0.3\n- Update Appium XCUITest driver dependency to 8.3.2\n\n## 2.13.0\n- Update Appium XCUITest driver dependency to 8.1.0\n\n## 2.12.0\n- Update Appium UIAutomator2 driver dependency to 3.10.0\n- Update Appium XCUITest driver dependency to 7.35.1\n\n## 2.11.0\n- Adds `flutter:getTextWithCommandExtension` command. Please check the README about how to use the command properly.\n- Update Appium UIAutomator2 driver dependency to 3.9.1\n- Update Appium XCUITest driver dependency to 7.32.0\n\n## 2.10.0\n- Adds `flutter:dragAndDropWithCommandExtension` command. Please check the README about how to use the command properly.\n- Update Appium UIAutomator2 driver dependency to 3.8.1\n- Update Appium XCUITest driver dependency to 7.28.3\n\n## 2.9.2\n- Fix observatory url finding after an app activation\n    - Bring `appium:maxRetryCount` and `appium:retryBackoffTime` back to use for the observaotry url findings.\n\n## 2.9.0 (2.9.1)\n- Tune syslog scanning to find the observatory url\n    - Drop `appium:maxRetryCount` and `appium:retryBackoffTime` as no usage\n- Update Appium UIAutomation2 driver dependency to 3.7.4\n- Update XCUITest driver dependency to 7.24.1\n\n## 2.8.0\n- Support `getWidgetDiagnostics`\n\n## 2.7.1\n- add logs around set context\n\n## 2.7.0\n- Update Appium UIAutomation2 driver dependency to 3.5.4\n- Update Appium XCUITest driver dependency to 7.17.5\n\n## 2.6.0\n- Update Appium XCUITest driver dependency to 7.11.1\n- `doctor` command can skip Android or iOS with environment variables\n\n## 2.5.1\n- fix: scroll until visible + scroll until tapable [#671](https://github.com/appium/appium-flutter-driver/pull/671)\n\n## 2.5.0\n- Update Appium XCUITest driver dependency to 6.0.1\n\n## 2.4.2\n- Removed unused dependencies\n\n## 2.4.1\n- Removed unused dependencies\n\n## 2.4.0\n- Update Appium UIAutomation2 driver dependency to 2.42.1\n- Update Appium XCUITest driver dependency to 5.14.0\n- Add `doctor` command\n\n## 2.3.0\n- Update Appium UIAutomation2 driver dependency to 2.37.0\n- Update Appium XCUITest driver dependency to 5.12.1\n\n## 2.2.3\n- fix leftover portforward\n\n## 2.2.2\n- fix: scrollUntilVisible and scrollUntilTapable https://github.com/appium/appium-flutter-driver/pull/622\n\n## 2.2.1\n- fix: typescript syntaxes\n\n## 2.2.0\n- Update Appium UIAutomation2 driver dependency to 2.34.1\n- Update Appium XCUITest driver dependency to 5.7.0\n\n## 2.1.0\n- Update Appium XCUITest driver dependency to 5.6.0\n\n## 2.0.0\n- Update Appium XCUITest driver dependency to 5.2.0. It supports iOS 15+.\n\n## 1.23.0\n- try the latest observatory url every attempt in connectSocket\n\n## 1.22.0\n- `skipAttachObservatoryUrl` option for `mobile:activateApp` to prevent trying to attach to an observatory url after activating the app.\n\n## 1.21.1\n- `appium:maxRetryCount` is 10 by default as optimization\n\n## 1.21.0\n\n- Add `isolateId` capability to configure it\n\n## 1.20.2 (1.20.0, 1.20.1 had broken lock file)\n- Add `adbPort`, `remoteAdbHost` and `forwardingPort` support\n\n## 1.19.1\n- Use XCUITest driver: 4.31.0\n   - Last iOS 14 and lower one work version\n\n## 1.19.0\n- Add `flutter:launchApp` to start an app via instrument service natively for iOS\n\n## 1.18.1\n- Keep using XCUITest driver v4.27.0 for iOS versions lower than 15.\n\n## 1.18.0\n- Add `flutter:connectObservatoryWsUrl` command to observe the url in the middle\n\n## 1.17.1\n- Make `mobile:activateApp` and `mobile:terminateApp` behavior same as `activateApp` and `terminateApp`\n\n## 1.17.0\n- Proxy device orientation api to NATIVE_APP context\n\n## 1.16.0\n- Update dependencies\n    - UIA2 driver: 2.29.2\n    - XCUITest driver: 4.32.19\n- Added `clickElement` as execute script. It is the same as other `tap` commands\n- Update `peerDependencies` as Appium 2.0\n\n## 1.15.0\n- Update dependencies such as UIA2/XCUITest drivers\n\n## 1.14.4\n- Fix element parsing for w3c element\n\n## 1.14.2, 1.14.3 (the same)\n- Add debug log when an exception occurred in the observatory url finding\n\n## 1.14.1\n- Bump the UIA2 version\n\n## 1.14.0\n- Fix proxyCommand for plugins [#425](https://github.com/appium-userland/appium-flutter-driver/pull/425)\n- Fix startNewCommandTimeout call [#426](https://github.com/appium-userland/appium-flutter-driver/pull/426)\n\n## 1.13.1\n- Fix no `waitTimeoutMilliseconds` argument case for scrollUntilVisible/scrollUntilTapable\n\n## 1.13.0\n- Add arguments in scrollUntilVisible/scrollUntilTapable\n    - `waitTimeoutMilliseconds`: The timeout to try scroll up to the timeout\n    - `durationMilliseconds`: The duration to do a scroll action. `timeout` in [scroll](https://api.flutter.dev/flutter/flutter_driver/FlutterDriver/scroll.html).\n    - `frequency`: The frequency to for the move events in  [scroll](https://api.flutter.dev/flutter/flutter_driver/FlutterDriver/scroll.html).\n\n\n## 1.12.0\n- Support `setClipboard` and `getClipboard` by always proxying the request to the NATIVE_APP context\n- Support non-`app` and non-`bundleId` nor non-`appPackage` session starts as `FLUTTER` context\n- Add `installApp` to install the test target after the new session request\n\n## 1.11.0\n- Add `activateApp` support to start an app\n\n## 1.10.0\n- Add `terminateApp` support to stop the running application\n    - The behavior is the same as when you call the same endpoint in NATIVE_APP context\n\n## 1.9.1\n- Improved error message when no observatory url found\n\n## 1.9.0\n- **Breaking change**\n    - Revert [#306](https://github.com/appium-userland/appium-flutter-driver/pull/306) (added in v1.5.0). `scrollUntilVisible` uses `waitFor` as same as before v1.5.0.\n        - Please use `scrollUntilTapable` instead since this version\n - Added `scrollUntilTapable` command to scroll with `waitForTappable` [#360](https://github.com/appium-userland/appium-flutter-driver/pull/360)\n\n## 1.8.0\n\nAppium `2.0.0-beta.46` and higher is needed as dependencies update in dependent Appium UIA2/XCUITest drivers\n\n- Added `timeout` argument for scrollIntoView [#358](https://github.com/appium-userland/appium-flutter-driver/pull/358)\n- Added `skipPortForward` capability [#343](https://github.com/appium-userland/appium-flutter-driver/pull/343)\n\n## 1.7.2 (1.7.1)\n- Fixed `* 1000` in `scroll` [#330](https://github.com/appium-userland/appium-flutter-driver/pull/330)\n\n## 1.7.0\n- **Breaking change**\n    - Do not calculate `* 1000` internally for milliseconds arguments to set them properly as same as README/examples. [#319](https://github.com/appium-userland/appium-flutter-driver/issues/319)\n\n## 1.6.0\n- Update for newer Appium 2 beta\n\n## 1.5.0\n\n- Use `waitForTappable` in `scrollUntilVisible` [#306](https://github.com/appium-userland/appium-flutter-driver/pull/306)\n\n## 1.4.0\n\n- Added `flutter:getIsolate` to get the isolate information [#298](https://github.com/appium-userland/appium-flutter-driver/pull/298)\n\n## 1.3.0\n\n- Added `flutter:getVMInfo` and `flutter:setIsolateId` commands to allow a session to switch the target isolate id [#292](https://github.com/appium-userland/appium-flutter-driver/pull/292)\n\n## 1.2.0\n\n- Added `waitForTappable` [#289](https://github.com/appium-userland/appium-flutter-driver/pull/289)\n\n## 1.1.2 (1.1.1)\n\n- Fixed checking observatory URL every trial [#287](https://github.com/appium-userland/appium-flutter-driver/pull/287)\n\n## 1.1.0\n\n- Support processLogToGetobservatory for Flutter >= 3.0.0 [#283](https://github.com/appium-userland/appium-flutter-driver/pull/283)\n"
  },
  {
    "path": "driver/eslint.config.mjs",
    "content": "import appiumConfig from '@appium/eslint-config-appium-ts';\n\nexport default [\n  ...appiumConfig\n];\n"
  },
  {
    "path": "driver/lib/commands/assertions.ts",
    "content": "import {FlutterDriver} from '../driver';\nimport {byValueKey, byText, byTooltip} from 'appium-flutter-finder';\nimport type {SerializableFinder} from 'appium-flutter-finder';\n\nexport type FinderInput =\n  | {key: string}\n  | {text: string}\n  | {label: string}\n  | SerializableFinder\n  | string\n  | {getRawFinder: () => SerializableFinder}; // FlutterElement-like input\n\n// Serialize a finder to base64\nconst serializeFinder = (finder: SerializableFinder): string =>\n  Buffer.from(JSON.stringify(finder)).toString('base64');\n\n// Type guards\nconst isRawFinder = (input: any): input is SerializableFinder =>\n  input && typeof input === 'object' && typeof input.finderType === 'string';\n\nconst isFlutterElementLike = (input: any): input is {getRawFinder: () => SerializableFinder} =>\n  input && typeof input === 'object' && typeof input.getRawFinder === 'function';\n\n// Convert FinderInput to base64 string\nfunction getFinderBase64(input: FinderInput): string {\n  if (typeof input === 'string') {\n    return input; // already base64\n  }\n\n  if (isFlutterElementLike(input)) {\n    return serializeFinder(input.getRawFinder());\n  }\n\n  if (isRawFinder(input)) {\n    return serializeFinder(input);\n  }\n\n  if ('key' in input) {\n    return byValueKey(input.key);\n  }\n\n  if ('text' in input) {\n    return byText(input.text);\n  }\n\n  if ('label' in input) {\n    return byTooltip(input.label);\n  }\n\n  throw new Error(\n    'Invalid finder input: must provide key, text, label, raw finder, or FlutterElement',\n  );\n}\n\n// Generic helper to wrap assert commands\nasync function executeAssertion(\n  driver: FlutterDriver,\n  command: string,\n  input: FinderInput,\n  timeout = 5000,\n  extraArgs: object = {},\n): Promise<void> {\n  const base64 = getFinderBase64(input);\n  try {\n    await driver.executeElementCommand(command, base64, {\n      timeout,\n      ...extraArgs,\n    });\n  } catch (err) {\n    throw new Error(`Assertion failed on command \"${command}\" within ${timeout}ms\\n${err}`);\n  }\n}\n\n// Exported assertion commands\nexport const assertVisible = async (\n  driver: FlutterDriver,\n  input: FinderInput,\n  timeout = 5000,\n): Promise<void> => await executeAssertion(driver, 'waitFor', input, timeout, {visible: true});\n\nexport const assertNotVisible = async (\n  driver: FlutterDriver,\n  input: FinderInput,\n  timeout = 5000,\n): Promise<void> => await executeAssertion(driver, 'waitForAbsent', input, timeout);\n\nexport const assertTappable = async (\n  driver: FlutterDriver,\n  input: FinderInput,\n  timeout = 5000,\n): Promise<void> => await executeAssertion(driver, 'waitForTappable', input, timeout);\n"
  },
  {
    "path": "driver/lib/commands/clipboard.ts",
    "content": "import type {FlutterDriver} from '../driver';\n\n/**\n * Set clipboard content via each native app driver\n * @param this the FlutterDriver\n * @param content the content to get the clipboard\n * @param contentType the contentType to set the data type\n */\nexport const setClipboard = async function (\n  this: FlutterDriver,\n  content: string,\n  contentType: string,\n) {\n  // @ts-expect-error this exist in xcuitestdriver or uia2 driver\n  await this.proxydriver?.setClipboard(content, contentType);\n};\n\n/**\n * Get the clipboard content via each native app driver\n * @param this the FlutterDriver\n * @param contentType the contentType to set the data type\n */\nexport const getClipboard = async function (this: FlutterDriver, contentType: string) {\n  // @ts-expect-error this exist in xcuitestdriver or uia2 driver\n  await this.proxydriver?.getClipboard(contentType);\n};\n"
  },
  {
    "path": "driver/lib/commands/context.ts",
    "content": "import type {FlutterDriver} from '../driver';\nimport {log} from '../logger';\n\nexport const FLUTTER_CONTEXT_NAME = `FLUTTER`;\nexport const NATIVE_CONTEXT_NAME = `NATIVE_APP`;\n\nexport const getCurrentContext = async function (this: FlutterDriver): Promise<string> {\n  return this.currentContext;\n};\n\nexport const setContext = async function (this: FlutterDriver, context: string) {\n  if ([FLUTTER_CONTEXT_NAME, NATIVE_CONTEXT_NAME].includes(context)) {\n    this.proxyWebViewActive = false;\n    // Set 'native context' when flutter driver sets the context to FLUTTER_CONTEXT_NAME\n    if (this.proxydriver) {\n      log.debug(\n        `Setting downstream drier context to '${NATIVE_CONTEXT_NAME}' in context '${context}'.`,\n      );\n      // @ts-expect-error this exist in xcuitestdriver or uia2 driver\n      await this.proxydriver.setContext(NATIVE_CONTEXT_NAME);\n    }\n  } else {\n    // this case may be 'webview'\n    if (this.proxydriver) {\n      log.debug(`Setting downstream drier context to '${context}'.`);\n      // @ts-expect-error this exist in xcuitestdriver or uia2 driver\n      await this.proxydriver.setContext(context);\n      this.proxyWebViewActive = true;\n    }\n  }\n  this.currentContext = context;\n  if (context === FLUTTER_CONTEXT_NAME) {\n    log.debug(\n      `Downstream driver context is set as 'NATIVE_APP' in 'FLUTTER' context to handle the native app.`,\n    );\n  }\n};\n\nexport const getContexts = async function (this: FlutterDriver): Promise<string[]> {\n  // @ts-expect-error this exist in xcuitestdriver or uia2 driver\n  const nativeContext = await this.proxydriver?.getContexts();\n  if (nativeContext) {\n    return [...(nativeContext as string[]), FLUTTER_CONTEXT_NAME];\n  } else {\n    return [FLUTTER_CONTEXT_NAME];\n  }\n};\n\nexport const driverShouldDoProxyCmd = function (this: FlutterDriver, command: string): boolean {\n  if (!this.proxydriver) {\n    return false;\n  }\n\n  if (this.currentContext === FLUTTER_CONTEXT_NAME) {\n    return false;\n  }\n\n  if ([`getCurrentContext`, `setContext`, `getContexts`].includes(command)) {\n    return false;\n  }\n\n  return true;\n};\n"
  },
  {
    "path": "driver/lib/commands/element.ts",
    "content": "import {FlutterDriver} from '../driver';\n\nexport const getText = async function (this: FlutterDriver, el: string): Promise<string | null> {\n  const response = await this.executeElementCommand(`get_text`, el);\n  return response.text;\n};\n\nexport const setValue = async function (\n  this: FlutterDriver,\n  textInput: string | [string],\n  el: string,\n) {\n  const clickPromise = this.click(el); // acquire focus\n  let text = ``;\n  if (textInput instanceof Array) {\n    text = textInput.reduce((previousValue, currentValue) => `${previousValue}${currentValue}`);\n  } else if (typeof textInput === `string`) {\n    text = textInput;\n  } else {\n    throw new Error(`Invalid textInput: ${textInput}`);\n  }\n  await clickPromise;\n  await this.execute(`flutter:enterText`, [text]);\n};\n\nexport const clear = async function (this: FlutterDriver, el: string) {\n  await this.setValue([``], el);\n};\n"
  },
  {
    "path": "driver/lib/commands/execute/scroll.ts",
    "content": "import _ from 'lodash';\nimport {FlutterDriver} from '../../driver';\nimport {waitFor, waitForTappable} from './wait';\n\nexport const scroll = async (\n  self: FlutterDriver,\n  elementBase64: string,\n  opts: {\n    dx: number;\n    dy: number;\n    durationMilliseconds: number;\n    frequency?: number;\n  },\n) => {\n  const {dx, dy, durationMilliseconds, frequency = 60} = opts;\n\n  if (\n    typeof dx !== `number` ||\n    typeof dy !== `number` ||\n    typeof durationMilliseconds !== `number` ||\n    typeof frequency !== `number`\n  ) {\n    // @todo BaseDriver's errors.InvalidArgumentError();\n    throw new Error(`${opts} is not a valid options`);\n  }\n\n  if (dx === 0 && dy === 0) {\n    // @todo BaseDriver's errors.InvalidArgumentError();\n    throw new Error(`${opts} is not a valid options`);\n  }\n\n  return await self.executeElementCommand(`scroll`, elementBase64, {\n    dx,\n    dy,\n    // 'scroll' expects microseconds\n    // https://github.com/flutter/flutter/blob/master/packages/flutter_driver/lib/src/common/gesture.dart#L33-L38\n    duration: durationMilliseconds * 1000,\n    frequency,\n  });\n};\n\nexport const longTap = async (\n  self: FlutterDriver,\n  elementBase64: string,\n  options: {\n    durationMilliseconds: number;\n    frequency?: number;\n  },\n) => {\n  const {durationMilliseconds = 1000, frequency = 60} = options;\n\n  if (typeof durationMilliseconds !== 'number' || typeof frequency !== 'number') {\n    throw new Error(`Invalid longTap options: ${JSON.stringify(options)}`);\n  }\n\n  return await self.executeElementCommand('scroll', elementBase64, {\n    dx: 0,\n    dy: 0,\n    duration: durationMilliseconds * 1000,\n    frequency,\n  });\n};\n\nconst validateOps = (alignment: any, dxScroll: any, dyScroll: any): boolean => {\n  if (\n    typeof alignment !== `number` ||\n    typeof dxScroll !== `number` ||\n    typeof dyScroll !== `number`\n  ) {\n    return false;\n  }\n\n  if (dxScroll === 0 && dyScroll === 0) {\n    return false;\n  }\n\n  return true;\n};\n\nconst shouldRetry = (startAt: number, waitTimeoutMilliseconds?: number): boolean => {\n  if (!waitTimeoutMilliseconds) {\n    // Then, the scroll should continue infinitely\n    return true;\n  }\n\n  return Date.now() - startAt < _.toInteger(waitTimeoutMilliseconds);\n};\n\nexport const scrollUntilVisible = async (\n  self: FlutterDriver,\n  elementBase64: string,\n  opts: {\n    item: string;\n    alignment: number;\n    dxScroll: number;\n    dyScroll: number;\n    durationMilliseconds: number;\n    frequency?: number;\n    waitTimeoutMilliseconds?: number;\n  },\n) => {\n  const {\n    item,\n    alignment = 0.0,\n    dxScroll = 0,\n    dyScroll = 0,\n    durationMilliseconds = 100,\n    frequency,\n    waitTimeoutMilliseconds,\n  } = opts;\n\n  if (!validateOps(alignment, dxScroll, dyScroll)) {\n    throw new Error(`${opts} is not a valid options`);\n  }\n\n  // An expectation for checking that an element, known to be present on the widget tree, is visible\n  let isVisible = false;\n  (async () => {\n    try {\n      await waitFor(self, item, waitTimeoutMilliseconds);\n      isVisible = true;\n    } catch {}\n  })();\n  const startAt = Date.now();\n  while (!isVisible && shouldRetry(startAt, waitTimeoutMilliseconds)) {\n    try {\n      await scroll(self, elementBase64, {\n        dx: dxScroll,\n        dy: dyScroll,\n        durationMilliseconds,\n        frequency,\n      });\n    } catch {\n      /* go to the next scroll */\n    }\n  }\n\n  if (!isVisible) {\n    throw new Error(`Stop scrolling as timeout ${waitTimeoutMilliseconds}`);\n  }\n\n  return scrollIntoView(self, item, {alignment});\n};\n\nexport const scrollUntilTapable = async (\n  self: FlutterDriver,\n  elementBase64: string,\n  opts: {\n    item: string;\n    alignment: number;\n    dxScroll: number;\n    dyScroll: number;\n    durationMilliseconds: number;\n    frequency?: number;\n    waitTimeoutMilliseconds?: number;\n  },\n) => {\n  const {\n    item,\n    alignment = 0.0,\n    dxScroll = 0,\n    dyScroll = 0,\n    durationMilliseconds = 100,\n    frequency,\n    waitTimeoutMilliseconds,\n  } = opts;\n\n  if (!validateOps(alignment, dxScroll, dyScroll)) {\n    throw new Error(`${opts} is not a valid options`);\n  }\n\n  // Kick off an (unawaited) waitForTappable that will complete when the item we're\n  // looking for finally scrolls onscreen and can be hit-tested. We add an initial pause to give it\n  // the chance to complete if the item is already onscreen; if not, scroll\n  // repeatedly until we either find the item or time out.\n  let isVisible = false;\n  (async () => {\n    try {\n      await waitForTappable(self, item, waitTimeoutMilliseconds);\n      isVisible = true;\n    } catch {}\n  })();\n  const startAt = Date.now();\n  while (!isVisible && shouldRetry(startAt, waitTimeoutMilliseconds)) {\n    try {\n      await scroll(self, elementBase64, {\n        dx: dxScroll,\n        dy: dyScroll,\n        durationMilliseconds,\n        frequency,\n      });\n    } catch {\n      /* go to the next scroll */\n    }\n  }\n\n  if (!isVisible) {\n    throw new Error(`Stop scrolling as timeout ${waitTimeoutMilliseconds}`);\n  }\n\n  return scrollIntoView(self, item, {alignment});\n};\n\nexport const scrollIntoView = async (\n  self: FlutterDriver,\n  elementBase64: string,\n  opts: {\n    alignment: number;\n    timeout?: number;\n  },\n) => {\n  const {alignment = 0.0, timeout} = opts;\n  if (\n    typeof alignment !== `number` ||\n    (typeof timeout !== `undefined` && typeof timeout !== `number`)\n  ) {\n    // @todo BaseDriver's errors.InvalidArgumentError();\n    throw new Error(`${opts} is not a valid options`);\n  }\n\n  const args = typeof timeout === `number` ? {alignment, timeout} : {alignment};\n\n  return await self.executeElementCommand(`scrollIntoView`, elementBase64, args);\n};\n"
  },
  {
    "path": "driver/lib/commands/execute/wait.ts",
    "content": "import {FlutterDriver} from '../../driver';\n\nconst waitForConstructor =\n  (command: `waitForAbsent` | `waitFor` | `waitForTappable`) =>\n  async (\n    self: FlutterDriver,\n    elementBase64: string,\n    durationMilliseconds?: number,\n  ): Promise<string> => {\n    let args = {};\n\n    if (typeof durationMilliseconds === `number`) {\n      args = {\n        timeout: durationMilliseconds,\n      };\n    } else if (typeof durationMilliseconds !== `undefined`) {\n      // @todo BaseDriver's errors.InvalidArgumentError();\n      throw new Error(`durationMilliseconds is not a valid options`);\n    }\n\n    await self.executeElementCommand(command, elementBase64, args);\n    return elementBase64;\n  };\n\nexport const waitForAbsent = waitForConstructor(`waitForAbsent`);\n\nexport const waitFor = waitForConstructor(`waitFor`);\n\nexport const waitForTappable = waitForConstructor(`waitForTappable`);\n"
  },
  {
    "path": "driver/lib/commands/execute.ts",
    "content": "/* eslint-disable @typescript-eslint/no-non-null-assertion */\nimport type {FlutterDriver} from '../driver';\nimport {reConnectFlutterDriver} from '../sessions/session';\nimport {\n  longTap,\n  scroll,\n  scrollIntoView,\n  scrollUntilVisible,\n  scrollUntilTapable,\n} from './execute/scroll';\nimport {waitFor, waitForAbsent, waitForTappable} from './execute/wait';\nimport {assertVisible, assertNotVisible, assertTappable, type FinderInput} from './assertions';\n\nimport {launchApp} from './../ios/app';\nimport B from 'bluebird';\n\nconst flutterCommandRegex = /^[\\s]*flutter[\\s]*:(.+)/;\n\n// Define types for better type safety\ntype CommandHandler = (driver: FlutterDriver, ...args: any[]) => Promise<any>;\ntype CommandMap = Record<string, CommandHandler>;\n\ninterface DragAndDropParams {\n  startX: string;\n  startY: string;\n  endX: string;\n  endY: string;\n  duration: string;\n}\n\ninterface DiagnosticsOptions {\n  subtreeDepth?: number;\n  includeProperties?: boolean;\n}\n\ninterface LongTapOptions {\n  durationMilliseconds: number;\n  frequency?: number;\n}\n\ninterface OffsetOptions {\n  offsetType: 'bottomLeft' | 'bottomRight' | 'center' | 'topLeft' | 'topRight';\n}\n\n// Extract command handlers into a separate object for better organization\nconst commandHandlers: CommandMap = {\n  launchApp: async (driver, appId: string, opts = {}) => {\n    const {arguments: args = [], environment: env = {}} = opts;\n    await launchApp(driver.internalCaps.udid!, appId, args, env);\n    await reConnectFlutterDriver.bind(driver)(driver.internalCaps);\n  },\n  connectObservatoryWsUrl: async (driver) => {\n    await reConnectFlutterDriver.bind(driver)(driver.internalCaps);\n  },\n  checkHealth: async (driver) => (await driver.executeElementCommand('get_health')).status,\n  getVMInfo: async (driver) => await driver.executeGetVMCommand(),\n  getRenderTree: async (driver) => (await driver.executeElementCommand('get_render_tree')).tree,\n  getOffset: async (driver, elementBase64: string, options: OffsetOptions) =>\n    await driver.executeElementCommand('get_offset', elementBase64, options),\n  waitForCondition: async (driver, conditionName: string) =>\n    await driver.executeElementCommand('waitForCondition', '', {\n      conditionName,\n    }),\n  forceGC: async (driver) => {\n    const response = (await driver.socket!.call('_collectAllGarbage', {\n      isolateId: driver.socket!.isolateId,\n    })) as {type: string};\n    if (response.type !== 'Success') {\n      throw new Error(`Could not forceGC, response was ${JSON.stringify(response)}`);\n    }\n  },\n  setIsolateId: async (driver, isolateId: string) => {\n    driver.socket!.isolateId = isolateId;\n    return await driver.socket!.call('getIsolate', {isolateId});\n  },\n  getIsolate: async (driver, isolateId?: string) =>\n    await driver.executeGetIsolateCommand(isolateId || driver.socket!.isolateId!),\n  clearTimeline: async (driver) => {\n    const call1 = driver.socket!.call('_clearVMTimeline');\n    const call2 = driver.socket!.call('clearVMTimeline');\n    const response = await B.any([call1, call2]);\n    if (response.type !== 'Success') {\n      throw new Error(`Could not clear timeline, response was ${JSON.stringify(response)}`);\n    }\n  },\n  getRenderObjectDiagnostics: async (\n    driver,\n    elementBase64: string,\n    opts: DiagnosticsOptions = {},\n  ) => {\n    const {subtreeDepth = 0, includeProperties = true} = opts;\n    return await driver.executeElementCommand('get_diagnostics_tree', elementBase64, {\n      diagnosticsType: 'renderObject',\n      includeProperties,\n      subtreeDepth,\n    });\n  },\n  getWidgetDiagnostics: async (driver, elementBase64: string, opts: DiagnosticsOptions = {}) => {\n    const {subtreeDepth = 0, includeProperties = true} = opts;\n    return await driver.executeElementCommand('get_diagnostics_tree', elementBase64, {\n      diagnosticsType: 'widget',\n      includeProperties,\n      subtreeDepth,\n    });\n  },\n  getSemanticsId: async (driver, elementBase64: string) =>\n    (await driver.executeElementCommand('get_semantics_id', elementBase64)).id,\n  waitForAbsent: async (driver, finder: string, timeout?: number) =>\n    await waitForAbsent(driver, finder, timeout),\n  waitFor: async (driver, finder: string, timeout?: number) =>\n    await waitFor(driver, finder, timeout),\n  waitForTappable: async (driver, finder: string, timeout?: number) =>\n    await waitForTappable(driver, finder, timeout),\n  scroll: async (driver, finder: string, opts: any) => await scroll(driver, finder, opts),\n  scrollUntilVisible: async (driver, finder: string, opts: any) =>\n    await scrollUntilVisible(driver, finder, opts),\n  scrollUntilTapable: async (driver, finder: string, opts: any) =>\n    await scrollUntilTapable(driver, finder, opts),\n  scrollIntoView: async (driver, finder: string, opts: any) =>\n    await scrollIntoView(driver, finder, opts),\n  setTextEntryEmulation: async (driver, enabled: boolean) =>\n    await driver.socket!.executeSocketCommand({\n      command: 'set_text_entry_emulation',\n      enabled,\n    }),\n  enterText: async (driver, text: string) =>\n    await driver.socket!.executeSocketCommand({command: 'enter_text', text}),\n  requestData: async (driver, message: string) =>\n    await driver.socket!.executeSocketCommand({\n      command: 'request_data',\n      message,\n    }),\n  longTap: async (driver, finder: string, durationOrOptions: LongTapOptions) =>\n    await longTap(driver, finder, durationOrOptions),\n  waitForFirstFrame: async (driver) =>\n    await driver.executeElementCommand('waitForCondition', '', {\n      conditionName: 'FirstFrameRasterizedCondition',\n    }),\n  setFrameSync: async (driver, enabled: boolean, durationMilliseconds: number) =>\n    await driver.socket!.executeSocketCommand({\n      command: 'set_frame_sync',\n      enabled,\n      timeout: durationMilliseconds,\n    }),\n  clickElement: async (driver, finder: string, opts: {timeout?: number} = {}) => {\n    const {timeout = 1000} = opts;\n    return await driver.executeElementCommand('tap', finder, {timeout});\n  },\n  dragAndDropWithCommandExtension: async (driver, params: DragAndDropParams) =>\n    await driver.socket!.executeSocketCommand({\n      command: 'dragAndDropWithCommandExtension',\n      ...params,\n    }),\n  assertVisible: async (driver, input: FinderInput, timeout = 5000) =>\n    await assertVisible(driver, input, timeout),\n  assertNotVisible: async (driver, input: FinderInput, timeout = 5000) =>\n    await assertNotVisible(driver, input, timeout),\n  assertTappable: async (driver, input: FinderInput, timeout = 5000) =>\n    await assertTappable(driver, input, timeout),\n  getTextWithCommandExtension: async (driver, params: {findBy: string}) =>\n    await driver.socket!.executeSocketCommand({\n      command: 'getTextWithCommandExtension',\n      findBy: params.findBy,\n    }),\n};\nexport const execute = async function (this: FlutterDriver, rawCommand: string, args: any[]) {\n  const matching = rawCommand.match(flutterCommandRegex);\n  if (!matching) {\n    throw new Error(`Command not supported: \"${rawCommand}\"`);\n  }\n\n  const command = matching[1].trim();\n  const handler = commandHandlers[command];\n\n  if (!handler) {\n    throw new Error(`Command not supported: \"${rawCommand}\"`);\n  }\n\n  return await handler(this, ...args);\n};\n"
  },
  {
    "path": "driver/lib/commands/gesture.ts",
    "content": "import type {FlutterDriver} from '../driver';\nimport {longTap as longClick} from './execute/scroll';\n\nexport const click = async function (this: FlutterDriver, el: string) {\n  const retVal = await this.tapEl(el, false);\n  return retVal;\n};\n\nexport const tapEl = async function (this: FlutterDriver, el: string, longPress: boolean) {\n  // perform a tap on the given element\n  // if longPress is true, the tap becomes a longPress action\n  const commandName = longPress ? `longPress` : `tap`;\n  return await this.executeElementCommand(commandName, el);\n};\n\nexport const tap = async function (\n  this: FlutterDriver,\n  gestures: Record<string, any>[],\n  longPress: boolean,\n) {\n  // parse the given gestures array to call the appropriate tap method\n  // if longPress is true, the tap is a long press action\n  const elementId = gestures[0].options.element;\n  await this.tapEl(elementId, longPress);\n};\n\nexport const longTap = async function (\n  this: FlutterDriver,\n  gestures: Record<string, any>[],\n  ms: number,\n) {\n  // pass duration if the wait action given by user.\n  // If wait action is missing taking 10000 ms default\n  const elementId = gestures[0].options.element;\n  return await longClick(this, elementId, {\n    durationMilliseconds: ms,\n    frequency: 30,\n  });\n};\n\nexport const performTouch = async function (this: FlutterDriver, gestures: Record<string, any>[]) {\n  if (gestures.length === 3) {\n    if (\n      gestures[0].action === `longPress` &&\n      gestures[1].action === `wait` &&\n      gestures[2].action === `release`\n    ) {\n      return await this.longTap(gestures, gestures[1].options.ms);\n    }\n  } else if (gestures.length === 2) {\n    if (gestures[0].action === `press` && gestures[1].action === `release`) {\n      return await this.tap(gestures, false);\n    } else if (gestures[0].action === `longPress` && gestures[1].action === `release`) {\n      return await this.longTap(gestures, 10 * 1000);\n    }\n  } else if (gestures.length === 1) {\n    if (gestures[0].action === `tap`) {\n      return await this.tap(gestures, false);\n    }\n\n    if (gestures[0].action === `longPress`) {\n      return await this.longTap(gestures, 10 * 1000);\n    }\n  }\n};\n"
  },
  {
    "path": "driver/lib/commands/screen.ts",
    "content": "import type {FlutterDriver} from '../driver';\nimport {IsolateSocket} from '../sessions/isolate_socket';\n\nexport const getScreenshot = async function (this: FlutterDriver) {\n  const response = (await (this.socket as IsolateSocket).call(`_flutter.screenshot`)) as any;\n  return response.screenshot;\n};\n"
  },
  {
    "path": "driver/lib/desired-caps.ts",
    "content": "export const desiredCapConstraints = {\n  app: {\n    isString: true,\n  },\n  avd: {\n    isString: true,\n  },\n  maxRetryCount: {\n    isNumber: true,\n  },\n  platformName: {\n    inclusionCaseInsensitive: ['iOS', 'Android'],\n    isString: true,\n    presence: true,\n  },\n  retryBackoffTime: {\n    isNumber: true,\n  },\n  udid: {\n    isString: true,\n  },\n  observatoryWsUri: {\n    isString: true,\n  },\n  skipPortForward: {\n    isBoolean: true,\n  },\n  adbPort: {\n    isNumber: true,\n  },\n  remoteAdbHost: {\n    isString: true,\n  },\n  forwardingPort: {\n    isNumber: true,\n  },\n} as const;\n"
  },
  {
    "path": "driver/lib/doctor/checks.js",
    "content": "import {doctor as androidDoctor} from 'appium-android-driver';\nimport {doctor as iosDoctor} from 'appium-xcuitest-driver';\n\n// shared\nexport const homeEnvVarCheck = /** @type {any} */ (iosDoctor.required.homeEnvVarCheck);\n\nlet androidHomeCheck;\nlet javaHomeCheck;\nlet javaHomeValueCheck;\nlet androidSdkCheck;\nlet optionalBundletoolCheck;\nlet optionalGstreamerCheck;\nif (!process.env.SKIP_ANDROID) {\n  androidHomeCheck = androidDoctor.androidHomeCheck;\n  javaHomeCheck = androidDoctor.javaHomeCheck;\n  javaHomeValueCheck = androidDoctor.javaHomeValueCheck;\n  androidSdkCheck = androidDoctor.androidSdkCheck;\n  optionalBundletoolCheck = androidDoctor.optionalBundletoolCheck;\n  optionalGstreamerCheck = androidDoctor.optionalGstreamerCheck;\n}\n\nlet xcodeCheck;\nlet xcodeToolsCheck;\nlet envVarAndPathCheck;\nlet optionalApplesimutilsCommandCheck;\nif (!process.env.SKIP_IOS) {\n  xcodeCheck = iosDoctor.required.xcodeCheck;\n  xcodeToolsCheck = iosDoctor.required.xcodeToolsCheck;\n  envVarAndPathCheck = /** @type {any} */ (iosDoctor.required.homeEnvVarCheck);\n  optionalApplesimutilsCommandCheck = iosDoctor.optional.optionalApplesimutilsCheck;\n}\n\n// shared\nexport const optionalFfmpegCheck = androidDoctor.optionalFfmpegCheck;\n\nexport {\n  androidHomeCheck,\n  javaHomeCheck,\n  javaHomeValueCheck,\n  androidSdkCheck,\n  optionalBundletoolCheck,\n  optionalGstreamerCheck,\n  xcodeCheck,\n  xcodeToolsCheck,\n  envVarAndPathCheck,\n  optionalApplesimutilsCommandCheck,\n};\n"
  },
  {
    "path": "driver/lib/driver.ts",
    "content": "// @ts-ignore: no 'errors' export module\nimport _ from 'lodash';\nimport {BaseDriver} from 'appium/driver';\nimport {log as logger} from './logger';\nimport {\n  executeElementCommand,\n  executeGetVMCommand,\n  executeGetIsolateCommand,\n} from './sessions/observatory';\nimport {PLATFORM} from './platform';\nimport {createSession, reConnectFlutterDriver} from './sessions/session';\nimport {\n  driverShouldDoProxyCmd,\n  FLUTTER_CONTEXT_NAME,\n  getContexts,\n  getCurrentContext,\n  NATIVE_CONTEXT_NAME,\n  setContext,\n} from './commands/context';\nimport {clear, getText, setValue} from './commands/element';\nimport {execute} from './commands/execute';\nimport {click, longTap, performTouch, tap, tapEl} from './commands/gesture';\nimport {getScreenshot} from './commands/screen';\nimport {getClipboard, setClipboard} from './commands/clipboard';\nimport {desiredCapConstraints} from './desired-caps';\nimport {XCUITestDriver} from 'appium-xcuitest-driver';\nimport {AndroidUiautomator2Driver} from 'appium-uiautomator2-driver';\nimport type {\n  DefaultCreateSessionResult,\n  DriverCaps,\n  DriverData,\n  W3CDriverCaps,\n  RouteMatcher,\n  Orientation,\n} from '@appium/types';\nimport type {IsolateSocket} from './sessions/isolate_socket';\nimport type {Server} from 'node:net';\nimport type {LogMonitor} from './sessions/log-monitor';\n\ntype FluttertDriverConstraints = typeof desiredCapConstraints;\n// Need to not proxy in WebView context\nconst WEBVIEW_NO_PROXY = [\n  [`GET`, new RegExp(`^/session/[^/]+/appium`)],\n  [`GET`, new RegExp(`^/session/[^/]+/context`)],\n  [`GET`, new RegExp(`^/session/[^/]+/element/[^/]+/rect`)],\n  [`GET`, new RegExp(`^/session/[^/]+/log/types$`)],\n  [`GET`, new RegExp(`^/session/[^/]+/orientation`)],\n  [`POST`, new RegExp(`^/session/[^/]+/appium`)],\n  [`POST`, new RegExp(`^/session/[^/]+/context`)],\n  [`POST`, new RegExp(`^/session/[^/]+/log$`)],\n  [`POST`, new RegExp(`^/session/[^/]+/orientation`)],\n  [`POST`, new RegExp(`^/session/[^/]+/touch/multi/perform`)],\n  [`POST`, new RegExp(`^/session/[^/]+/touch/perform`)],\n] as import('@appium/types').RouteMatcher[];\n\nclass FlutterDriver extends BaseDriver<FluttertDriverConstraints> {\n  public socket: IsolateSocket | null;\n  public locatorStrategies = [`key`, `css selector`];\n  public proxydriver: XCUITestDriver | AndroidUiautomator2Driver | null;\n  public device: any;\n\n  public portForwardLocalPort: string | null;\n  public localServer: Server | null;\n  protected _logmon: LogMonitor | null;\n\n  // Used to keep the capabilities internally\n  public internalCaps: DriverCaps<FluttertDriverConstraints>;\n\n  public receiveAsyncResponse: (...args: any[]) => Promise<any>;\n\n  // to handle WebView context\n  public proxyWebViewActive = false;\n\n  // session\n  public executeElementCommand = executeElementCommand;\n  public executeGetVMCommand = executeGetVMCommand;\n  public executeGetIsolateCommand = executeGetIsolateCommand;\n  public execute = execute;\n  public executeAsync = execute;\n\n  // element\n  public getText = getText;\n  public setValue = setValue;\n  public clear = clear;\n  public getScreenshot = getScreenshot;\n\n  // gesture\n  public click = click;\n  public longTap = longTap;\n  public tapEl = tapEl;\n  public tap = tap;\n  public performTouch = performTouch;\n\n  // context\n\n  public getContexts = getContexts;\n  public getCurrentContext = getCurrentContext;\n  public setContext = setContext;\n  protected currentContext = FLUTTER_CONTEXT_NAME;\n  private driverShouldDoProxyCmd = driverShouldDoProxyCmd;\n\n  // content\n  public getClipboard = getClipboard;\n  public setClipboard = setClipboard;\n\n  constructor(opts, shouldValidateCaps: boolean) {\n    super(opts, shouldValidateCaps);\n    this.socket = null;\n    this.device = null;\n    this._logmon = null;\n    this.desiredCapConstraints = desiredCapConstraints;\n\n    // Used to keep the port for port forward to clear the pair.\n    this.portForwardLocalPort = null;\n\n    // Used for iOS to end the local server to proxy the request.\n    this.localServer = null;\n  }\n\n  public async createSession(\n    ...args\n  ): Promise<DefaultCreateSessionResult<FluttertDriverConstraints>> {\n    const [sessionId, caps] = await super.createSession(\n      ...(JSON.parse(JSON.stringify(args)) as [\n        W3CDriverCaps,\n        W3CDriverCaps,\n        W3CDriverCaps,\n        DriverData[],\n      ]),\n    );\n    this.internalCaps = caps;\n    return createSession.bind(this)(sessionId, caps, ...JSON.parse(JSON.stringify(args)));\n  }\n\n  public async deleteSession() {\n    this.log.info(`Deleting Flutter Driver session`);\n\n    this._logmon?.stop();\n    this._logmon = null;\n    this.proxydriver?.eventEmitter?.removeAllListeners('syslogStarted');\n\n    this.log.info('Cleanup the port forward');\n    switch (_.toLower(this.internalCaps.platformName)) {\n      case PLATFORM.IOS:\n        this.localServer?.close();\n        this.localServer = null;\n        break;\n      case PLATFORM.ANDROID:\n        if (this.portForwardLocalPort) {\n          if (this.proxydriver) {\n            await (this.proxydriver as AndroidUiautomator2Driver).adb?.removePortForward(\n              this.portForwardLocalPort,\n            );\n          }\n        }\n        break;\n    }\n\n    if (this.proxydriver) {\n      this.log.info('Deleting the proxy driver session.');\n      try {\n        await this.proxydriver.deleteSession(this.sessionId || undefined);\n      } catch (e) {\n        this.log.warn(e.message);\n      }\n      this.proxydriver = null;\n    }\n\n    await super.deleteSession();\n  }\n\n  public async installApp(appPath: string, opts = {}) {\n    // @ts-expect-error this exist in xcuitestdriver or uia2 driver\n    this.proxydriver?.installApp(appPath, opts);\n  }\n\n  public async activateApp(appId: string) {\n    // @ts-expect-error this exist in xcuitestdriver or uia2 driver\n    this.proxydriver?.activateApp(appId);\n    await reConnectFlutterDriver.bind(this)(this.internalCaps);\n  }\n\n  public async terminateApp(appId: string) {\n    // @ts-expect-error this exist in xcuitestdriver or uia2 driver\n    return await this.proxydriver?.terminateApp(appId);\n  }\n\n  public async back() {\n    // @ts-expect-error this exist in xcuitestdriver or uia2 driver\n    return await this.proxydriver?.back();\n  }\n\n  public async getOrientation(): Promise<string | null> {\n    if (!this.proxydriver) {\n      return null;\n    }\n    switch (_.toLower(this.internalCaps.platformName)) {\n      case PLATFORM.IOS:\n        return await (this.proxydriver as XCUITestDriver).proxyCommand('/orientation', 'GET');\n      default:\n        return await (this.proxydriver as AndroidUiautomator2Driver).getOrientation();\n    }\n  }\n\n  public async setOrientation(orientation: string) {\n    switch (_.toLower(this.internalCaps.platformName)) {\n      case PLATFORM.IOS:\n        return await (this.proxydriver as XCUITestDriver).proxyCommand('/orientation', 'POST', {\n          orientation,\n        });\n      default:\n        return await (this.proxydriver as AndroidUiautomator2Driver).setOrientation(\n          orientation as Orientation,\n        );\n    }\n  }\n\n  public validateLocatorStrategy(strategy: string) {\n    // @todo refactor DRY\n    if (this.currentContext === `NATIVE_APP`) {\n      return this.proxydriver?.validateLocatorStrategy(strategy);\n    }\n    super.validateLocatorStrategy(strategy, false);\n  }\n\n  validateDesiredCaps(\n    caps: DriverCaps<FluttertDriverConstraints>,\n  ): caps is DriverCaps<FluttertDriverConstraints> {\n    // check with the base class, and return if it fails\n    const res = super.validateDesiredCaps(caps);\n    if (!res) {\n      return res;\n    }\n\n    // finally, return true since the superclass check passed, as did this\n    return true;\n  }\n\n  public async proxyCommand(url: string, method: string, body = null) {\n    // @ts-expect-error this exist in xcuitestdriver or uia2 driver\n    const result = await this.proxydriver?.proxyCommand(url, method, body);\n    return result;\n  }\n\n  public async executeCommand(\n    cmd: string,\n    ...args: [string, [{skipAttachObservatoryUrl: string; any: any}]]\n  ) {\n    if (new RegExp(/^[\\s]*mobile:[\\s]*activateApp$/).test(args[0])) {\n      const {skipAttachObservatoryUrl = false} = args[1][0];\n      await this.proxydriver?.executeCommand(cmd, ...args);\n      if (skipAttachObservatoryUrl) {\n        return;\n      }\n      await reConnectFlutterDriver.bind(this)(this.internalCaps);\n      return;\n    } else if (new RegExp(/^[\\s]*mobile:[\\s]*terminateApp$/).test(args[0])) {\n      // to make the behavior as same as this.terminateApp\n      return await this.proxydriver?.executeCommand(cmd, ...args);\n    } else if (cmd === `receiveAsyncResponse`) {\n      logger.debug(`Executing FlutterDriver response '${cmd}'`);\n      return await this.receiveAsyncResponse(...args);\n    } else if ([`setOrientation`, `getOrientation`, `back`].includes(cmd)) {\n      // The `setOrientation` and `getOrientation` commands are handled differently\n      // for iOS and Android platforms. These commands are deferred to the base driver's\n      // implementation (`super.executeCommand`) to ensure compatibility with both platforms\n      // and to leverage the platform-specific logic already implemented in the base driver.\n      logger.debug(`Executing FlutterDriver command '${cmd}'`);\n      return await super.executeCommand(cmd, ...args);\n    } else {\n      if (this.driverShouldDoProxyCmd(cmd)) {\n        logger.debug(`Executing proxied driver command '${cmd}'`);\n\n        // There are 2 CommandTimeout (FlutterDriver and proxy)\n        // Only FlutterDriver CommandTimeout is used; Proxy is disabled\n        // All proxy commands needs to reset the FlutterDriver CommandTimeout\n        // Here we manually reset the FlutterDriver CommandTimeout for commands that goes to proxy.\n        this.clearNewCommandTimeout();\n        const result = await this.proxydriver?.executeCommand(cmd, ...args);\n        this.startNewCommandTimeout();\n        return result;\n      } else {\n        logger.debug(`Executing Flutter driver command '${cmd}'`);\n        return await super.executeCommand(cmd, ...args);\n      }\n    }\n  }\n\n  public getProxyAvoidList(): RouteMatcher[] {\n    if ([FLUTTER_CONTEXT_NAME, NATIVE_CONTEXT_NAME].includes(this.currentContext)) {\n      return [];\n    }\n\n    return WEBVIEW_NO_PROXY;\n  }\n\n  public proxyActive(): boolean {\n    // In WebView context, all request should got to each driver\n    // so that they can handle http request properly.\n    // On iOS, WebView context is handled by XCUITest driver while Android is by chromedriver.\n    // It means XCUITest driver should keep the XCUITest driver as a proxy,\n    // while UIAutomator2 driver should proxy to chromedriver instead of UIA2 proxy.\n    return this.proxyWebViewActive && this.proxydriver?.constructor.name !== XCUITestDriver.name;\n  }\n\n  public canProxy(): boolean {\n    // As same as proxyActive, all request should got to each driver\n    // so that they can handle http request properly\n    return this.proxyWebViewActive;\n  }\n}\n\nexport {FlutterDriver};\n"
  },
  {
    "path": "driver/lib/ios/app.ts",
    "content": "import {services, INSTRUMENT_CHANNEL} from 'appium-ios-device';\nimport {log} from './../logger';\n\n/**\n * Launch the given bundle id via instrument service.\n */\nexport const launchApp = async (\n  udid: string,\n  bundleId: string,\n  args = [],\n  env = {},\n): Promise<boolean> => {\n  let instrumentService;\n  try {\n    instrumentService = await services.startInstrumentService(udid);\n    log.info(\n      `Launching app ${bundleId} with arguments ${JSON.stringify(args)} and env ${JSON.stringify(env)} on device ${udid}`,\n    );\n    await instrumentService.callChannel(\n      INSTRUMENT_CHANNEL.PROCESS_CONTROL,\n      'launchSuspendedProcessWithDevicePath:bundleIdentifier:environment:arguments:options:',\n      '',\n      bundleId,\n      env,\n      args,\n      {StartSuspendedKey: 0, KillExisting: 1},\n    );\n    return true;\n  } catch (err) {\n    log.warn(`Failed to launch '${bundleId}'. Original error: ${err.stderr || err.message}`);\n    return false;\n  } finally {\n    if (instrumentService) {\n      instrumentService.close();\n    }\n  }\n};\n"
  },
  {
    "path": "driver/lib/logger.ts",
    "content": "import {logger} from '@appium/support';\nimport {AppiumLogger} from '@appium/types';\n\nexport const log: AppiumLogger = logger.getLogger(`FlutterDriver`);\n"
  },
  {
    "path": "driver/lib/platform.ts",
    "content": "export const PLATFORM = {\n  IOS: 'ios',\n  ANDROID: 'android',\n} as const;\n"
  },
  {
    "path": "driver/lib/sessions/android.ts",
    "content": "import {AndroidUiautomator2Driver} from 'appium-uiautomator2-driver';\nimport {connectSocket, extractObservatoryUrl, OBSERVATORY_URL_PATTERN} from './observatory';\nimport type {InitialOpts, StringRecord} from '@appium/types';\nimport type {IsolateSocket} from './isolate_socket';\nimport {FlutterDriver} from '../driver';\nimport {LogMonitor} from './log-monitor';\nimport type {LogEntry} from './log-monitor';\n\nexport async function startAndroidSession(\n  this: FlutterDriver,\n  caps: Record<string, any>,\n  ...args: any[]\n): Promise<[AndroidUiautomator2Driver, IsolateSocket | null]> {\n  this.log.info(`Starting an Android proxy session`);\n  const androiddriver = new AndroidUiautomator2Driver({} as InitialOpts);\n  if (!caps.observatoryWsUri) {\n    androiddriver.eventEmitter.once('syslogStarted', (syslog) => {\n      this._logmon = new LogMonitor(syslog, async (entry: LogEntry) => {\n        if (extractObservatoryUrl(entry)) {\n          this.log.debug(`Matched the syslog line '${entry.message}'`);\n          return true;\n        }\n        return false;\n      });\n      this._logmon.start();\n    });\n  }\n  //@ts-ignore Args are ok\n  await androiddriver.createSession(...args);\n\n  // the session starts without any apps\n  if (caps.app === undefined && caps.appPackage === undefined) {\n    return [androiddriver, null];\n  }\n\n  return [androiddriver, await connectAndroidSession.bind(this)(androiddriver, caps)];\n}\n\nexport async function connectAndroidSession(\n  this: FlutterDriver,\n  androiddriver: AndroidUiautomator2Driver,\n  caps: Record<string, any>,\n  clearLog: boolean = false,\n): Promise<IsolateSocket> {\n  const observatoryWsUri = await getObservatoryWsUri.bind(this)(androiddriver, caps, clearLog);\n  return await connectSocket.bind(this)(observatoryWsUri, caps);\n}\n\nexport async function getObservatoryWsUri(\n  this: FlutterDriver,\n  proxydriver: AndroidUiautomator2Driver,\n  caps: StringRecord,\n  clearLog: boolean = false,\n): Promise<string> {\n  if (clearLog) {\n    this._logmon?.clearlastMatch();\n    this._logmon?.stop();\n    this._logmon?.start();\n  }\n\n  let urlObject: URL;\n  if (caps.observatoryWsUri) {\n    urlObject = new URL(caps.observatoryWsUri);\n    urlObject.protocol = `ws`;\n\n    // defaults to skip the port-forwarding as backward compatibility\n    if (caps.skipPortForward === undefined || caps.skipPortForward) {\n      return urlObject.toJSON();\n    }\n  } else {\n    if (!this._logmon) {\n      throw new Error(\n        `The mandatory logcat service must be running in order to initialize the Flutter driver. ` +\n          `Have you disabled it in capabilities?`,\n      );\n    }\n\n    let lastMatch: LogEntry | null = null;\n    try {\n      lastMatch = await this._logmon.waitForLastMatchExist(\n        caps.maxRetryCount,\n        caps.retryBackoffTime,\n      );\n    } catch (e) {\n      this.log.error(e);\n    }\n    if (!lastMatch) {\n      throw new Error(\n        `No observatory URL matching to '${OBSERVATORY_URL_PATTERN}' was found in the device log. ` +\n          `Please make sure the application under test is configured properly according to ` +\n          `https://github.com/appium/appium-flutter-driver#usage and that it does not crash on startup.`,\n      );\n    }\n    urlObject = extractObservatoryUrl(lastMatch) as URL;\n  }\n  const remotePort = urlObject.port;\n  this.portForwardLocalPort = caps.forwardingPort ?? remotePort;\n  urlObject.port = this.portForwardLocalPort as string;\n  await proxydriver.adb.forwardPort(this.portForwardLocalPort as string, remotePort);\n  if (!caps.observatoryWsUri && proxydriver.adb.adbHost) {\n    urlObject.host = proxydriver.adb.adbHost;\n  }\n  return urlObject.toJSON();\n}\n"
  },
  {
    "path": "driver/lib/sessions/base64url.ts",
    "content": "import _ from 'lodash';\nimport {util} from '@appium/support';\n\nexport const decode = (\n  input: string | {ELEMENT: string} | {[util.W3C_WEB_ELEMENT_IDENTIFIER]: string},\n): string => {\n  let base64String: string = ``;\n  if (_.isString(input)) {\n    base64String = input as string;\n  } else if (_.has(input, util.W3C_WEB_ELEMENT_IDENTIFIER)) {\n    base64String = input[util.W3C_WEB_ELEMENT_IDENTIFIER] as string;\n  } else if (_.has(input, 'ELEMENT')) {\n    // @ts-ignore TS2339\n    base64String = input.ELEMENT as string;\n  } else {\n    throw new Error(\n      `Input is expected to be a base64-encoded string or a valid element object. ` +\n        `${JSON.stringify(input)} has been provided instead`,\n    );\n  }\n  return Buffer.from(base64String, `base64`).toString();\n};\n"
  },
  {
    "path": "driver/lib/sessions/ios.ts",
    "content": "import {utilities} from 'appium-ios-device';\nimport {XCUITestDriver} from 'appium-xcuitest-driver';\nimport B from 'bluebird';\nimport net from 'node:net';\nimport {checkPortStatus} from 'portscanner';\nimport {connectSocket, extractObservatoryUrl, OBSERVATORY_URL_PATTERN} from './observatory';\nimport type {IsolateSocket} from './isolate_socket';\nimport {LogMonitor} from './log-monitor';\nimport type {LogEntry} from './log-monitor';\nimport type {FlutterDriver} from '../driver';\nimport type {XCUITestDriverOpts} from 'appium-xcuitest-driver/build/lib/driver';\n\nconst LOCALHOST = `127.0.0.1`;\n\nexport async function startIOSSession(\n  this: FlutterDriver,\n  caps: Record<string, any>,\n  ...args: any[]\n): Promise<[XCUITestDriver, IsolateSocket | null]> {\n  this.log.info(`Starting an IOS proxy session`);\n  const iosdriver = new XCUITestDriver({} as XCUITestDriverOpts);\n  if (!caps.observatoryWsUri) {\n    iosdriver.eventEmitter.once('syslogStarted', (syslog) => {\n      this._logmon = new LogMonitor(syslog, async (entry: LogEntry) => {\n        if (extractObservatoryUrl(entry)) {\n          this.log.debug(`Matched the syslog line '${entry.message}'`);\n          return true;\n        }\n        return false;\n      });\n      this._logmon.start();\n    });\n  }\n  // @ts-expect-error can be ignored\n  await iosdriver.createSession(...args);\n\n  // the session starts without any apps\n  if (caps.app === undefined && caps.bundleId === undefined) {\n    return [iosdriver, null];\n  }\n\n  return [iosdriver, await connectIOSSession.bind(this)(iosdriver, caps)];\n}\n\nexport async function connectIOSSession(\n  this: FlutterDriver,\n  iosdriver: XCUITestDriver,\n  caps: Record<string, any>,\n  clearLog: boolean = false,\n): Promise<IsolateSocket> {\n  const observatoryWsUri = await getObservatoryWsUri.bind(this)(iosdriver, caps, clearLog);\n  return await connectSocket.bind(this)(observatoryWsUri, iosdriver, caps);\n}\n\nasync function requireFreePort(this: FlutterDriver, port: number) {\n  // Try to close existing local server if it exists\n  if (this.localServer) {\n    this.log.info(`Closing existing local server on port ${port}`);\n    await new Promise<void>((resolve) => {\n      this.localServer?.close((err) => {\n        if (err) {\n          this.log.error(`Error occurred while closing the local server: ${err.message}`);\n          return resolve(); // Resolve even if there's an error to avoid hanging\n        }\n        this.log.info(`Previous local server closed`);\n        resolve();\n      });\n    });\n  }\n  if ((await checkPortStatus(port, LOCALHOST)) !== `open`) {\n    return;\n  }\n  this.log.warn(`Port #${port} is busy. Did you quit the previous driver session(s) properly?`);\n  throw new Error(\n    `The port :${port} is occupied by an other process. ` +\n      `You can either quit that process or select another free port.`,\n  );\n}\n\nexport async function getObservatoryWsUri(\n  this: FlutterDriver,\n  proxydriver: XCUITestDriver,\n  caps: Record<string, any>,\n  clearLog: boolean = false,\n): Promise<string> {\n  if (clearLog) {\n    this._logmon?.clearlastMatch();\n    this._logmon?.stop();\n    this._logmon?.start();\n  }\n\n  let urlObject;\n  if (caps.observatoryWsUri) {\n    urlObject = new URL(caps.observatoryWsUri);\n    urlObject.protocol = `ws`;\n\n    // defaults to skip the port-forwarding as backward compatibility\n    if (caps.skipPortForward === undefined || caps.skipPortForward) {\n      return urlObject.toJSON();\n    }\n  } else {\n    if (!this._logmon) {\n      throw new Error(\n        `The mandatory syslog service must be running in order to initialize the Flutter driver. ` +\n          `Have you disabled it in capabilities?`,\n      );\n    }\n\n    let lastMatch: LogEntry | null = null;\n    try {\n      lastMatch = await this._logmon.waitForLastMatchExist(\n        caps.maxRetryCount,\n        caps.retryBackoffTime,\n      );\n    } catch (e) {\n      this.log.error(e);\n    }\n    if (!lastMatch) {\n      throw new Error(\n        `No observatory URL matching to '${OBSERVATORY_URL_PATTERN}' was found in the device log. ` +\n          `Please make sure the application under test is configured properly according to ` +\n          `https://github.com/appium/appium-flutter-driver#usage and that it does not crash on startup.`,\n      );\n    }\n    urlObject = extractObservatoryUrl(lastMatch) as URL;\n  }\n  if (!proxydriver.isRealDevice()) {\n    this.log.info(`Running on iOS simulator`);\n    return urlObject.toJSON();\n  }\n\n  const remotePort = urlObject.port;\n  const localPort = caps.forwardingPort ?? remotePort;\n  urlObject.port = localPort;\n\n  this.log.info(`Running on iOS real device`);\n  const {udid} = proxydriver.opts;\n  await requireFreePort.bind(this)(localPort);\n  this.localServer = net.createServer(async (localSocket) => {\n    let remoteSocket;\n    try {\n      remoteSocket = await utilities.connectPort(udid, remotePort);\n    } catch {\n      localSocket.destroy();\n      return;\n    }\n\n    const destroyCommChannel = () => {\n      remoteSocket.unpipe(localSocket);\n      localSocket.unpipe(remoteSocket);\n    };\n    remoteSocket.once(`close`, () => {\n      destroyCommChannel();\n      localSocket.destroy();\n    });\n    remoteSocket.on('error', (e) => this.log.debug(e));\n\n    localSocket.once(`end`, destroyCommChannel);\n    localSocket.once(`close`, () => {\n      destroyCommChannel();\n      remoteSocket.destroy();\n    });\n    localSocket.on('error', (e) => this.log.warn(e.message));\n    localSocket.pipe(remoteSocket);\n    remoteSocket.pipe(localSocket);\n  });\n  const listeningPromise = new B((resolve, reject) => {\n    this.localServer?.once(`listening`, resolve);\n    this.localServer?.once(`error`, reject);\n  });\n  this.localServer?.listen(localPort);\n  try {\n    await listeningPromise;\n  } catch (e) {\n    this.localServer = null;\n    throw new Error(`Cannot listen on the local port ${localPort}. Original error: ${e.message}`);\n  }\n\n  this.log.info(`Forwarding the remote port ${remotePort} to the local port ${localPort}`);\n\n  process.on(`beforeExit`, () => {\n    this.localServer?.close();\n    this.localServer = null;\n  });\n  return urlObject.toJSON();\n}\n"
  },
  {
    "path": "driver/lib/sessions/isolate_socket.ts",
    "content": "import {Client} from 'rpc-websockets';\n\ninterface ExecuteArgs {\n  command: string;\n  [key: string]: any;\n}\n\nexport class IsolateSocket extends Client {\n  public isolateId: number | string = 0;\n  public async executeSocketCommand(args: ExecuteArgs) {\n    // call an RPC method with parameters\n    return this.call(`ext.flutter.driver`, {\n      ...args,\n      isolateId: this.isolateId,\n    }) as Promise<{\n      isError: boolean;\n      response: any;\n    }>;\n  }\n}\n"
  },
  {
    "path": "driver/lib/sessions/log-monitor.ts",
    "content": "import type {EventEmitter} from 'node:events';\nimport {retryInterval} from 'asyncbox';\nexport interface LogEntry {\n  timestamp: number;\n  level: string;\n  message: string;\n}\n\nconst DEFAULT_MAX_RETRY_COUNT = 10;\nconst DEFAULT_BACKOFF_TIME_MS = 3000;\n\nexport type Filter = (x: LogEntry) => Promise<boolean>;\n\nexport class LogMonitor {\n  private readonly _logsEmitter: EventEmitter;\n  private readonly _filter: Filter;\n  private _lastMatch: LogEntry | null;\n  private _outputListener: ((logEntry: LogEntry) => any) | null;\n\n  constructor(logsEmitter: EventEmitter, filter: Filter) {\n    this._logsEmitter = logsEmitter;\n    this._outputListener = null;\n    this._filter = filter;\n    this._lastMatch = null;\n  }\n\n  get started(): boolean {\n    return Boolean(this._outputListener);\n  }\n\n  clearlastMatch() {\n    this._lastMatch = null;\n  }\n\n  get lastMatch(): LogEntry | null {\n    return this._lastMatch;\n  }\n\n  async waitForLastMatchExist(\n    maxRetryCount: number = DEFAULT_MAX_RETRY_COUNT,\n    retryBackoffTime: number = DEFAULT_BACKOFF_TIME_MS,\n  ): Promise<LogEntry | null> {\n    return await retryInterval(maxRetryCount, retryBackoffTime, async () => {\n      if (this._lastMatch !== null) {\n        return this._lastMatch;\n      }\n      throw new Error(\n        `No matched log found with ${retryBackoffTime} ms interval ` +\n          `up to ${maxRetryCount} times. Increasing appium:retryBackoffTime ` +\n          `and appium:maxRetryCount would help.`,\n      );\n    });\n  }\n\n  start(): this {\n    if (this.started) {\n      return this;\n    }\n\n    this._outputListener = this._onOutput.bind(this);\n    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n    this._logsEmitter.on('output', this._outputListener!);\n    return this;\n  }\n\n  stop(): this {\n    if (!this.started) {\n      return this;\n    }\n\n    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n    this._logsEmitter.off('output', this._outputListener!);\n    this._outputListener = null;\n    return this;\n  }\n\n  private async _onOutput(logEntry: LogEntry): Promise<void> {\n    if (await this._filter(logEntry)) {\n      this._lastMatch = logEntry;\n    }\n  }\n}\n"
  },
  {
    "path": "driver/lib/sessions/observatory.ts",
    "content": "import {URL} from 'node:url';\nimport _ from 'lodash';\nimport type {FlutterDriver} from '../driver';\nimport {IsolateSocket} from './isolate_socket';\nimport {decode} from './base64url';\nimport type {LogEntry} from './log-monitor';\nimport {retryInterval} from 'asyncbox';\n\nconst truncateLength = 500;\n// https://github.com/flutter/flutter/blob/f90b019c68edf4541a4c8273865a2b40c2c01eb3/dev/devicelab/lib/framework/runner.dart#L183\n//  e.g. 'Observatory listening on http://127.0.0.1:52817/_w_SwaKs9-g=/'\n// https://github.com/flutter/flutter/blob/52ae102f182afaa0524d0d01d21b2d86d15a11dc/packages/flutter_tools/lib/src/resident_runner.dart#L1386-L1389\n//  e.g. 'An Observatory debugger and profiler on ${device.device.name} is available at: http://127.0.0.1:52817/_w_SwaKs9-g=/'\nexport const OBSERVATORY_URL_PATTERN = new RegExp(\n  `(Observatory listening on |` +\n    `An Observatory debugger and profiler on\\\\s.+\\\\sis available at: |` +\n    `The Dart VM service is listening on )` +\n    `((http|//)[a-zA-Z0-9:/=_\\\\-.\\\\[\\\\]]+)`,\n);\n\nconst moduleCheckIntervalCount = 30;\nconst moduleCheckIntervalMs = 500;\n\n// SOCKETS\nexport async function connectSocket(\n  this: FlutterDriver,\n  dartObservatoryURL: string,\n  caps: Record<string, any>,\n): Promise<IsolateSocket> {\n  const isolateId = caps.isolateId;\n\n  this.log.debug(`Establishing a connection to the Dart Observatory`);\n\n  const connectedPromise = new Promise<IsolateSocket | null>((resolve) => {\n    const socket = new IsolateSocket(dartObservatoryURL);\n\n    const removeListenerAndResolve = (r: IsolateSocket | null) => {\n      socket.removeListener(`error`, onErrorListener);\n      socket.removeListener(`timeout`, onTimeoutListener);\n      socket.removeListener(`open`, onOpenListener);\n      resolve(r);\n    };\n\n    // Add an 'error' event handler for the client socket\n    const onErrorListener = (ex: Error) => {\n      this.log.error(`Connection to ${dartObservatoryURL} got an error: ${ex.message}`);\n      removeListenerAndResolve(null);\n    };\n    socket.on(`error`, onErrorListener);\n    // Add a 'close' event handler for the client socket\n    socket.on(`close`, () => {\n      this.log.info(`Connection to ${dartObservatoryURL} closed`);\n      // @todo do we need to set this.socket = null?\n    });\n    // Add a 'timeout' event handler for the client socket\n    const onTimeoutListener = () => {\n      this.log.error(`Connection to ${dartObservatoryURL} timed out`);\n      removeListenerAndResolve(null);\n    };\n    socket.on(`timeout`, onTimeoutListener);\n    const onOpenListener = async () => {\n      const originalSocketCall = socket.call;\n      socket.call = async (...args: any) => {\n        try {\n          // `await` is needed so that rejected promise will be thrown and caught\n          return await originalSocketCall.apply(socket, args);\n        } catch (e) {\n          this.log.errorWithException(new Error(JSON.stringify(e)));\n        }\n      };\n      this.log.info(`Connecting to Dart Observatory: ${dartObservatoryURL}`);\n\n      if (isolateId) {\n        this.log.info(`Listing the given isolate id: ${isolateId}`);\n        socket.isolateId = isolateId;\n      } else {\n        const vm = (await socket.call(`getVM`)) as {\n          isolates: [\n            {\n              name: string;\n              id: number;\n            },\n          ];\n        };\n        this.log.info(`Listing all isolates: ${JSON.stringify(vm.isolates)}`);\n        // To accept 'main.dart:main()' and 'main'\n        const mainIsolateData = vm.isolates.find((e) => e.name.includes(`main`));\n        if (!mainIsolateData) {\n          this.log.error(`Cannot get Dart main isolate info`);\n          removeListenerAndResolve(null);\n          socket.close();\n          return;\n        }\n        // e.g. 'isolates/2978358234363215', '2978358234363215'\n        socket.isolateId = mainIsolateData.id;\n      }\n\n      // It could take time to load the expected module.\n      try {\n        await retryInterval(moduleCheckIntervalCount, moduleCheckIntervalMs, async () => {\n          const isolate = (await socket.call(`getIsolate`, {\n            isolateId: `${socket.isolateId}`,\n          })) as {\n            extensionRPCs: [string] | null;\n          } | null;\n          if (!isolate) {\n            throw new Error(`Cannot get main Dart Isolate`);\n          }\n          if (!Array.isArray(isolate.extensionRPCs)) {\n            throw new Error(\n              `Cannot get Dart extensionRPCs from isolate ${JSON.stringify(isolate)}`,\n            );\n          }\n          if (isolate.extensionRPCs.indexOf(`ext.flutter.driver`) < 0) {\n            throw new Error(\n              `\"ext.flutter.driver\" is not found in \"extensionRPCs\" ${JSON.stringify(isolate.extensionRPCs)}`,\n            );\n          }\n        });\n      } catch (e) {\n        this.log.error(e.message);\n        removeListenerAndResolve(null);\n        return;\n      }\n      removeListenerAndResolve(socket);\n    };\n    socket.on(`open`, onOpenListener);\n  });\n\n  const connectedSocket = await connectedPromise;\n  if (connectedSocket) {\n    return connectedSocket;\n  }\n\n  throw new Error(\n    `Cannot connect to the Dart Observatory URL ${dartObservatoryURL}. ` +\n      `Check the server log for more details`,\n  );\n}\n\nexport async function executeGetIsolateCommand(this: FlutterDriver, isolateId: string | number) {\n  this.log.debug(`>>> getIsolate`);\n  const isolate = await (this.socket as IsolateSocket).call(`getIsolate`, {\n    isolateId: `${isolateId}`,\n  });\n  this.log.debug(`<<< ${_.truncate(JSON.stringify(isolate), {length: truncateLength})}`);\n  return isolate;\n}\n\nexport async function executeGetVMCommand(this: FlutterDriver) {\n  this.log.debug(`>>> getVM`);\n  const vm = (await (this.socket as IsolateSocket).call(`getVM`)) as {\n    isolates: [\n      {\n        name: string;\n        id: number;\n      },\n    ];\n  };\n  this.log.debug(`<<< ${_.truncate(JSON.stringify(vm), {length: truncateLength})}`);\n  return vm;\n}\n\nexport async function executeElementCommand(\n  this: FlutterDriver,\n  command: string,\n  elementBase64?: string,\n  extraArgs = {},\n) {\n  const elementObject = elementBase64 ? JSON.parse(decode(elementBase64)) : {};\n  const serializedCommand = {command, ...elementObject, ...extraArgs};\n  this.log.debug(`>>> ${JSON.stringify(serializedCommand)}`);\n  const data = await (this.socket as IsolateSocket).executeSocketCommand(serializedCommand);\n  this.log.debug(`<<< ${JSON.stringify(data)} | previous command ${command}`);\n  if (data.isError) {\n    throw new Error(\n      `Cannot execute command ${command}, server response ${JSON.stringify(data, null, 2)}`,\n    );\n  }\n  return data.response;\n}\n\nexport function extractObservatoryUrl(logEntry: LogEntry): URL | null {\n  const match = logEntry.message.match(OBSERVATORY_URL_PATTERN);\n  if (!match) {\n    return null;\n  }\n\n  try {\n    const result = new URL(match[2]);\n    result.protocol = `ws`;\n    result.pathname += `ws`;\n    return result;\n  } catch {\n    return null;\n  }\n}\n"
  },
  {
    "path": "driver/lib/sessions/session.ts",
    "content": "import type {FlutterDriver} from '../driver';\nimport _ from 'lodash';\nimport {startAndroidSession, connectAndroidSession} from './android';\nimport {startIOSSession, connectIOSSession} from './ios';\nimport {PLATFORM} from '../platform';\nimport type {XCUITestDriver} from 'appium-xcuitest-driver';\nimport type {AndroidUiautomator2Driver} from 'appium-uiautomator2-driver';\n\nexport const reConnectFlutterDriver = async function (\n  this: FlutterDriver,\n  caps: Record<string, any>,\n) {\n  // setup proxies - if platformName is not empty, make it less case sensitive\n  if (!caps.platformName) {\n    this.log.errorWithException(new Error(`No platformName was given`));\n  }\n\n  switch (_.toLower(caps.platformName)) {\n    case PLATFORM.IOS:\n      this.socket = await connectIOSSession.bind(this)(this.proxydriver, caps, true);\n      break;\n    case PLATFORM.ANDROID:\n      this.socket = await connectAndroidSession.bind(this)(this.proxydriver, caps, true);\n      break;\n    default:\n      this.log.errorWithException(\n        new Error(\n          `Unsupported platformName: ${caps.platformName}. ` +\n            `Only the following platforms are supported: ${_.keys(PLATFORM)}`,\n        ),\n      );\n  }\n};\n\nexport const createSession: any = async function (\n  this: FlutterDriver,\n  sessionId: string,\n  caps,\n  ...args\n) {\n  try {\n    // setup proxies - if platformName is not empty, make it less case sensitive\n    switch (_.toLower(caps.platformName)) {\n      case PLATFORM.IOS:\n        [this.proxydriver, this.socket] = await startIOSSession.bind(this)(caps, ...args);\n        (this.proxydriver as XCUITestDriver).relaxedSecurityEnabled = this.relaxedSecurityEnabled;\n        (this.proxydriver as XCUITestDriver).denyInsecure = this.denyInsecure;\n        (this.proxydriver as XCUITestDriver).allowInsecure = this.allowInsecure;\n\n        break;\n      case PLATFORM.ANDROID:\n        [this.proxydriver, this.socket] = await startAndroidSession.bind(this)(caps, ...args);\n        (this.proxydriver as AndroidUiautomator2Driver).relaxedSecurityEnabled =\n          this.relaxedSecurityEnabled;\n        (this.proxydriver as AndroidUiautomator2Driver).denyInsecure = this.denyInsecure;\n        (this.proxydriver as AndroidUiautomator2Driver).allowInsecure = this.allowInsecure;\n        break;\n      default:\n        this.log.errorWithException(\n          new Error(\n            `Unsupported platformName: ${caps.platformName}. ` +\n              `Only the following platforms are supported: ${_.keys(PLATFORM)}`,\n          ),\n        );\n    }\n\n    return [sessionId, this.opts];\n  } catch (e) {\n    await this.deleteSession();\n    throw e;\n  }\n};\n"
  },
  {
    "path": "driver/npm-shrinkwrap.json",
    "content": "{\n  \"name\": \"appium-flutter-driver\",\n  \"version\": \"3.6.0\",\n  \"lockfileVersion\": 3,\n  \"requires\": true,\n  \"packages\": {\n    \"\": {\n      \"name\": \"appium-flutter-driver\",\n      \"version\": \"3.6.0\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"appium-android-driver\": \"^13.0.0\",\n        \"appium-flutter-finder\": \"^0.2.0\",\n        \"appium-ios-device\": \"^3.0.0\",\n        \"appium-uiautomator2-driver\": \"^7.0.0\",\n        \"appium-xcuitest-driver\": \"^10.0.0\",\n        \"asyncbox\": \"^6.0.1\",\n        \"bluebird\": \"^3.1.1\",\n        \"lodash\": \"^4.0.0\",\n        \"portscanner\": \"^2.2.0\",\n        \"rpc-websockets\": \"^10.0.0\"\n      },\n      \"devDependencies\": {\n        \"@appium/eslint-config-appium-ts\": \"^3.0.0\",\n        \"@appium/tsconfig\": \"^1.0.0\",\n        \"@appium/types\": \"^1.0.0\",\n        \"@semantic-release/changelog\": \"^6.0.3\",\n        \"@semantic-release/git\": \"^10.0.1\",\n        \"prettier\": \"^3.0.0\",\n        \"semantic-release\": \"^25.0.2\",\n        \"ts-node\": \"^10.9.1\",\n        \"typescript\": \"~5.9\"\n      },\n      \"engines\": {\n        \"node\": \"^20.19.0 || ^22.12.0 || >=24.0.0\",\n        \"npm\": \">=10\"\n      },\n      \"peerDependencies\": {\n        \"appium\": \"^3.0.0\"\n      }\n    },\n    \"node_modules/@appium/base-driver\": {\n      \"version\": \"10.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/@appium/base-driver/-/base-driver-10.3.0.tgz\",\n      \"integrity\": \"sha512-9r+1f9EtcJt9NXIlyHdFMoD7DsAZPzpRq4Kj1hGZf7+26q1SFEyyMAuWxvlWGY7EoyPtPRyMUkM4dHiSK3Q9+w==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"@appium/support\": \"7.1.0\",\n        \"@appium/types\": \"1.3.0\",\n        \"@colors/colors\": \"1.6.0\",\n        \"async-lock\": \"1.4.1\",\n        \"asyncbox\": \"6.1.0\",\n        \"axios\": \"1.15.0\",\n        \"bluebird\": \"3.7.2\",\n        \"body-parser\": \"2.2.2\",\n        \"express\": \"5.2.1\",\n        \"fastest-levenshtein\": \"1.0.16\",\n        \"http-status-codes\": \"2.3.0\",\n        \"lodash\": \"4.18.1\",\n        \"lru-cache\": \"11.3.3\",\n        \"method-override\": \"3.0.0\",\n        \"morgan\": \"1.10.1\",\n        \"path-to-regexp\": \"8.4.2\",\n        \"serve-favicon\": \"2.5.1\",\n        \"type-fest\": \"5.5.0\"\n      },\n      \"engines\": {\n        \"node\": \"^20.19.0 || ^22.12.0 || >=24.0.0\",\n        \"npm\": \">=10\"\n      },\n      \"optionalDependencies\": {\n        \"spdy\": \"4.0.2\"\n      }\n    },\n    \"node_modules/@appium/logger\": {\n      \"version\": \"2.0.6\",\n      \"resolved\": \"https://registry.npmjs.org/@appium/logger/-/logger-2.0.6.tgz\",\n      \"integrity\": \"sha512-9e8n9CtINBwi1ASEU5OyswmR2F7OnbrGfmf9yTy9i+rx4GR9RJlEp0/arsxvuyWCep67tOmM4FiRyXxxHjOK5Q==\",\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"console-control-strings\": \"1.1.0\",\n        \"lodash\": \"4.18.1\",\n        \"lru-cache\": \"11.3.3\",\n        \"set-blocking\": \"2.0.0\"\n      },\n      \"engines\": {\n        \"node\": \"^20.19.0 || ^22.12.0 || >=24.0.0\",\n        \"npm\": \">=10\"\n      }\n    },\n    \"node_modules/@appium/schema\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/@appium/schema/-/schema-1.1.0.tgz\",\n      \"integrity\": \"sha512-m0vTLU7mhC9RR294Nz84g+FhEQ0iZKq6p3rfz1+qfEqCXRXUvDbllSOu2tCVpBKMIoEFZAmkwjuwXobJpCnilQ==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"json-schema\": \"0.4.0\"\n      },\n      \"engines\": {\n        \"node\": \"^20.19.0 || ^22.12.0 || >=24.0.0\",\n        \"npm\": \">=10\"\n      }\n    },\n    \"node_modules/@appium/support\": {\n      \"version\": \"7.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/@appium/support/-/support-7.1.0.tgz\",\n      \"integrity\": \"sha512-kY4Qv4TzLCYmZnN2eNptEa8RiRzpbimIQ6tKuDaqLC2Y3q5Al4NumL/xRQAvfXJq/hNezq2Jh8NwciEW8zX/0g==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"@appium/logger\": \"2.0.6\",\n        \"@appium/tsconfig\": \"1.1.2\",\n        \"@appium/types\": \"1.3.0\",\n        \"@colors/colors\": \"1.6.0\",\n        \"archiver\": \"7.0.1\",\n        \"asyncbox\": \"6.1.0\",\n        \"axios\": \"1.15.0\",\n        \"base64-stream\": \"1.0.0\",\n        \"bluebird\": \"3.7.2\",\n        \"bplist-creator\": \"0.1.1\",\n        \"bplist-parser\": \"0.3.2\",\n        \"form-data\": \"4.0.5\",\n        \"get-stream\": \"9.0.1\",\n        \"glob\": \"13.0.6\",\n        \"jsftp\": \"2.1.3\",\n        \"klaw\": \"4.1.0\",\n        \"lockfile\": \"1.0.4\",\n        \"lodash\": \"4.18.1\",\n        \"log-symbols\": \"7.0.1\",\n        \"ncp\": \"2.0.0\",\n        \"package-directory\": \"8.2.0\",\n        \"plist\": \"3.1.0\",\n        \"pluralize\": \"8.0.0\",\n        \"read-pkg\": \"10.1.0\",\n        \"resolve-from\": \"5.0.0\",\n        \"sanitize-filename\": \"1.6.4\",\n        \"semver\": \"7.7.4\",\n        \"shell-quote\": \"1.8.3\",\n        \"supports-color\": \"10.2.2\",\n        \"teen_process\": \"4.1.0\",\n        \"type-fest\": \"5.5.0\",\n        \"uuid\": \"13.0.0\",\n        \"which\": \"6.0.1\",\n        \"yauzl\": \"3.3.0\"\n      },\n      \"engines\": {\n        \"node\": \"^20.19.0 || ^22.12.0 || >=24.0.0\",\n        \"npm\": \">=10\"\n      },\n      \"optionalDependencies\": {\n        \"sharp\": \"0.34.5\"\n      }\n    },\n    \"node_modules/@appium/tsconfig\": {\n      \"version\": \"1.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/@appium/tsconfig/-/tsconfig-1.1.2.tgz\",\n      \"integrity\": \"sha512-lHKBm7hXCROc1Ha/cBxS4o3iQkeY96Pz7qM9Uh9vFDkdpTGBk56V1lmc3iGcgBYKBlaRT/LZmTsqClvHoiXhvw==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"@tsconfig/node20\": \"20.1.9\"\n      },\n      \"engines\": {\n        \"node\": \"^20.19.0 || ^22.12.0 || >=24.0.0\",\n        \"npm\": \">=10\"\n      }\n    },\n    \"node_modules/@appium/types\": {\n      \"version\": \"1.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/@appium/types/-/types-1.3.0.tgz\",\n      \"integrity\": \"sha512-Gv4ev/5K5N7TvAHqem2DmB50zipC951QlmCDpuxDNHQl2dtCr20vJgnN8if7upqLcBX/6yNp3udR+f1n99zgcQ==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"@appium/logger\": \"2.0.6\",\n        \"@appium/schema\": \"1.1.0\",\n        \"@appium/tsconfig\": \"1.1.2\",\n        \"type-fest\": \"5.5.0\"\n      },\n      \"engines\": {\n        \"node\": \"^20.19.0 || ^22.12.0 || >=24.0.0\",\n        \"npm\": \">=10\"\n      }\n    },\n    \"node_modules/@babel/code-frame\": {\n      \"version\": \"7.29.0\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz\",\n      \"integrity\": \"sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@babel/helper-validator-identifier\": \"^7.28.5\",\n        \"js-tokens\": \"^4.0.0\",\n        \"picocolors\": \"^1.1.1\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      }\n    },\n    \"node_modules/@babel/helper-validator-identifier\": {\n      \"version\": \"7.28.5\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz\",\n      \"integrity\": \"sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      }\n    },\n    \"node_modules/@colors/colors\": {\n      \"version\": \"1.6.0\",\n      \"resolved\": \"https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz\",\n      \"integrity\": \"sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=0.1.90\"\n      }\n    },\n    \"node_modules/@img/colour\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz\",\n      \"integrity\": \"sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==\",\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@img/sharp-darwin-arm64\": {\n      \"version\": \"0.34.5\",\n      \"resolved\": \"https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz\",\n      \"integrity\": \"sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"license\": \"Apache-2.0\",\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ],\n      \"engines\": {\n        \"node\": \"^18.17.0 || ^20.3.0 || >=21.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://opencollective.com/libvips\"\n      },\n      \"optionalDependencies\": {\n        \"@img/sharp-libvips-darwin-arm64\": \"1.2.4\"\n      }\n    },\n    \"node_modules/@img/sharp-libvips-darwin-arm64\": {\n      \"version\": \"1.2.4\",\n      \"resolved\": \"https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz\",\n      \"integrity\": \"sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"license\": \"LGPL-3.0-or-later\",\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ],\n      \"funding\": {\n        \"url\": \"https://opencollective.com/libvips\"\n      }\n    },\n    \"node_modules/@isaacs/cliui\": {\n      \"version\": \"8.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz\",\n      \"integrity\": \"sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==\",\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"string-width\": \"^5.1.2\",\n        \"string-width-cjs\": \"npm:string-width@^4.2.0\",\n        \"strip-ansi\": \"^7.0.1\",\n        \"strip-ansi-cjs\": \"npm:strip-ansi@^6.0.1\",\n        \"wrap-ansi\": \"^8.1.0\",\n        \"wrap-ansi-cjs\": \"npm:wrap-ansi@^7.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/@isaacs/cliui/node_modules/ansi-styles\": {\n      \"version\": \"6.2.3\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz\",\n      \"integrity\": \"sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/ansi-styles?sponsor=1\"\n      }\n    },\n    \"node_modules/@isaacs/cliui/node_modules/emoji-regex\": {\n      \"version\": \"9.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz\",\n      \"integrity\": \"sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/@isaacs/cliui/node_modules/string-width\": {\n      \"version\": \"5.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz\",\n      \"integrity\": \"sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"eastasianwidth\": \"^0.2.0\",\n        \"emoji-regex\": \"^9.2.2\",\n        \"strip-ansi\": \"^7.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/@isaacs/cliui/node_modules/strip-ansi\": {\n      \"version\": \"7.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz\",\n      \"integrity\": \"sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"ansi-regex\": \"^6.2.2\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/strip-ansi?sponsor=1\"\n      }\n    },\n    \"node_modules/@isaacs/cliui/node_modules/wrap-ansi\": {\n      \"version\": \"8.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz\",\n      \"integrity\": \"sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"ansi-styles\": \"^6.1.0\",\n        \"string-width\": \"^5.0.1\",\n        \"strip-ansi\": \"^7.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/wrap-ansi?sponsor=1\"\n      }\n    },\n    \"node_modules/@pkgjs/parseargs\": {\n      \"version\": \"0.11.0\",\n      \"resolved\": \"https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz\",\n      \"integrity\": \"sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==\",\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"engines\": {\n        \"node\": \">=14\"\n      }\n    },\n    \"node_modules/@sec-ant/readable-stream\": {\n      \"version\": \"0.4.1\",\n      \"resolved\": \"https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz\",\n      \"integrity\": \"sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/@swc/helpers\": {\n      \"version\": \"0.5.21\",\n      \"resolved\": \"https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.21.tgz\",\n      \"integrity\": \"sha512-jI/VAmtdjB/RnI8GTnokyX7Ug8c+g+ffD6QRLa6XQewtnGyukKkKSk3wLTM3b5cjt1jNh9x0jfVlagdN2gDKQg==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"tslib\": \"^2.8.0\"\n      }\n    },\n    \"node_modules/@tsconfig/node20\": {\n      \"version\": \"20.1.9\",\n      \"resolved\": \"https://registry.npmjs.org/@tsconfig/node20/-/node20-20.1.9.tgz\",\n      \"integrity\": \"sha512-IjlTv1RsvnPtUcjTqtVsZExKVq+KQx4g5pCP5tI7rAs6Xesl2qFwSz/tPDBC4JajkL/MlezBu3gPUwqRHl+RIg==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/@types/node\": {\n      \"version\": \"25.6.0\",\n      \"resolved\": \"https://registry.npmjs.org/@types/node/-/node-25.6.0.tgz\",\n      \"integrity\": \"sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"undici-types\": \"~7.19.0\"\n      }\n    },\n    \"node_modules/@types/normalize-package-data\": {\n      \"version\": \"2.4.4\",\n      \"resolved\": \"https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz\",\n      \"integrity\": \"sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/@types/uuid\": {\n      \"version\": \"8.3.4\",\n      \"resolved\": \"https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz\",\n      \"integrity\": \"sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/@types/ws\": {\n      \"version\": \"8.18.1\",\n      \"resolved\": \"https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz\",\n      \"integrity\": \"sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@types/node\": \"*\"\n      }\n    },\n    \"node_modules/@xmldom/xmldom\": {\n      \"version\": \"0.9.9\",\n      \"resolved\": \"https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.9.9.tgz\",\n      \"integrity\": \"sha512-qycIHAucxy/LXAYIjmLmtQ8q9GPnMbnjG1KXhWm9o5sCr6pOYDATkMPiTNa6/v8eELyqOQ2FsEqeoFYmgv/gJg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=14.6\"\n      }\n    },\n    \"node_modules/abort-controller\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz\",\n      \"integrity\": \"sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"event-target-shim\": \"^5.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6.5\"\n      }\n    },\n    \"node_modules/accepts\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz\",\n      \"integrity\": \"sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"mime-types\": \"^3.0.0\",\n        \"negotiator\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.6\"\n      }\n    },\n    \"node_modules/ansi-regex\": {\n      \"version\": \"6.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz\",\n      \"integrity\": \"sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/ansi-regex?sponsor=1\"\n      }\n    },\n    \"node_modules/ansi-styles\": {\n      \"version\": \"4.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz\",\n      \"integrity\": \"sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"color-convert\": \"^2.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/ansi-styles?sponsor=1\"\n      }\n    },\n    \"node_modules/appium-adb\": {\n      \"version\": \"14.3.2\",\n      \"resolved\": \"https://registry.npmjs.org/appium-adb/-/appium-adb-14.3.2.tgz\",\n      \"integrity\": \"sha512-V3YLPzHHG8vjw8oQ7d7sR6OvbadLIYwv5WYji3/YBrAe0NTRzhzj07e/m3XML+ipDOweZhKBebAclavdgkJWWg==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"@appium/support\": \"^7.0.0-rc.1\",\n        \"async-lock\": \"^1.0.0\",\n        \"asyncbox\": \"^6.0.1\",\n        \"bluebird\": \"^3.4.7\",\n        \"ini\": \"^6.0.0\",\n        \"lodash\": \"^4.0.0\",\n        \"lru-cache\": \"^11.1.0\",\n        \"semver\": \"^7.0.0\",\n        \"teen_process\": \"^4.0.4\"\n      },\n      \"engines\": {\n        \"node\": \"^20.19.0 || ^22.12.0 || >=24.0.0\",\n        \"npm\": \">=10\"\n      }\n    },\n    \"node_modules/appium-android-driver\": {\n      \"version\": \"13.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/appium-android-driver/-/appium-android-driver-13.1.2.tgz\",\n      \"integrity\": \"sha512-ZzzJvGjxhGSNEwgK3DS8zs5yXAQ9u7n+vRV25dYN2Dt1ORrvsbEBnKhv9+5a/FeV9ivKg47J6r2kDV8DcDL8LQ==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"@appium/support\": \"^7.0.0-rc.1\",\n        \"@colors/colors\": \"^1.6.0\",\n        \"appium-adb\": \"^14.3.0\",\n        \"appium-chromedriver\": \"^8.2.25\",\n        \"asyncbox\": \"^6.1.0\",\n        \"axios\": \"^1.x\",\n        \"bluebird\": \"^3.4.7\",\n        \"io.appium.settings\": \"^7.0.4\",\n        \"lodash\": \"^4.17.4\",\n        \"lru-cache\": \"^11.1.0\",\n        \"moment\": \"^2.24.0\",\n        \"moment-timezone\": \"^0.x\",\n        \"portscanner\": \"^2.2.0\",\n        \"semver\": \"^7.0.0\",\n        \"teen_process\": \"^4.0.7\",\n        \"ws\": \"^8.0.0\"\n      },\n      \"engines\": {\n        \"node\": \"^20.19.0 || ^22.12.0 || >=24.0.0\",\n        \"npm\": \">=10\"\n      },\n      \"peerDependencies\": {\n        \"appium\": \"^3.0.0-rc.2\"\n      }\n    },\n    \"node_modules/appium-chromedriver\": {\n      \"version\": \"8.2.26\",\n      \"resolved\": \"https://registry.npmjs.org/appium-chromedriver/-/appium-chromedriver-8.2.26.tgz\",\n      \"integrity\": \"sha512-/H+N52PPmv5j7FJnOHIdtaKeKxAXdo9SOB1QCXnGb4Qi9dDc5KupJZFykKuy03/c9uaHqyga3wrT+rmkRl5Nug==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"@appium/base-driver\": \"^10.0.0-rc.2\",\n        \"@appium/support\": \"^7.0.0-rc.1\",\n        \"@xmldom/xmldom\": \"^0.x\",\n        \"appium-adb\": \"^14.0.0\",\n        \"asyncbox\": \"^6.0.1\",\n        \"axios\": \"^1.6.5\",\n        \"bluebird\": \"^3.5.1\",\n        \"compare-versions\": \"^6.0.0\",\n        \"lodash\": \"^4.17.4\",\n        \"semver\": \"^7.0.0\",\n        \"teen_process\": \"^4.0.4\",\n        \"xpath\": \"^0.x\"\n      },\n      \"engines\": {\n        \"node\": \"^20.19.0 || ^22.12.0 || >=24.0.0\",\n        \"npm\": \">=10\"\n      }\n    },\n    \"node_modules/appium-flutter-finder\": {\n      \"version\": \"0.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/appium-flutter-finder/-/appium-flutter-finder-0.2.0.tgz\",\n      \"integrity\": \"sha512-klwh74phzhU6OhSf/arHVHP7AF6fyQGZ2GgzX/wO+gPKIS+rNWOQgizPPimki3H4goB7wB0TaicamN/DCqLmRA==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-ios-device\": {\n      \"version\": \"3.1.10\",\n      \"resolved\": \"https://registry.npmjs.org/appium-ios-device/-/appium-ios-device-3.1.10.tgz\",\n      \"integrity\": \"sha512-2oE7yQtLSdrcZ9YArqgGguzDuiplHj0GXSMlTfwTXl0n22DEzkV0M1mXdaNaWNuzVBJ5VDc1EuYv38p1ruuk2g==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"@appium/support\": \"^7.0.0-rc.1\",\n        \"asyncbox\": \"^6.0.1\",\n        \"axios\": \"^1.6.7\",\n        \"bluebird\": \"^3.1.1\",\n        \"bplist-creator\": \"^0.x\",\n        \"bplist-parser\": \"^0.x\",\n        \"lodash\": \"^4.17.15\",\n        \"semver\": \"^7.0.0\"\n      },\n      \"engines\": {\n        \"node\": \"^20.19.0 || ^22.12.0 || >=24.0.0\",\n        \"npm\": \">=10\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver\": {\n      \"version\": \"7.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/appium-uiautomator2-driver/-/appium-uiautomator2-driver-7.1.2.tgz\",\n      \"integrity\": \"sha512-exm8loSaNFh61DMTf/BeFL/J6xY6w+Ta24g8exKEchowCWpm4zimGC4y8BRoP6+1iQ+R88x4fMIvAx8Uf9M7bQ==\",\n      \"hasShrinkwrap\": true,\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"appium-adb\": \"^14.0.0\",\n        \"appium-android-driver\": \"^13.1.1\",\n        \"appium-uiautomator2-server\": \"^9.11.1\",\n        \"asyncbox\": \"^6.0.1\",\n        \"axios\": \"^1.13.5\",\n        \"bluebird\": \"^3.5.1\",\n        \"css-selector-parser\": \"^3.0.0\",\n        \"io.appium.settings\": \"^7.0.1\",\n        \"lodash\": \"^4.17.4\",\n        \"portscanner\": \"^2.2.0\",\n        \"teen_process\": \"^4.0.4\"\n      },\n      \"engines\": {\n        \"node\": \"^20.19.0 || ^22.12.0 || >=24.0.0\",\n        \"npm\": \">=10\"\n      },\n      \"peerDependencies\": {\n        \"appium\": \"^3.0.0-rc.2\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/@appium/base-driver\": {\n      \"version\": \"10.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/@appium/base-driver/-/base-driver-10.3.0.tgz\",\n      \"integrity\": \"sha512-9r+1f9EtcJt9NXIlyHdFMoD7DsAZPzpRq4Kj1hGZf7+26q1SFEyyMAuWxvlWGY7EoyPtPRyMUkM4dHiSK3Q9+w==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"@appium/support\": \"7.1.0\",\n        \"@appium/types\": \"1.3.0\",\n        \"@colors/colors\": \"1.6.0\",\n        \"async-lock\": \"1.4.1\",\n        \"asyncbox\": \"6.1.0\",\n        \"axios\": \"1.15.0\",\n        \"bluebird\": \"3.7.2\",\n        \"body-parser\": \"2.2.2\",\n        \"express\": \"5.2.1\",\n        \"fastest-levenshtein\": \"1.0.16\",\n        \"http-status-codes\": \"2.3.0\",\n        \"lodash\": \"4.18.1\",\n        \"lru-cache\": \"11.3.3\",\n        \"method-override\": \"3.0.0\",\n        \"morgan\": \"1.10.1\",\n        \"path-to-regexp\": \"8.4.2\",\n        \"serve-favicon\": \"2.5.1\",\n        \"type-fest\": \"5.5.0\"\n      },\n      \"engines\": {\n        \"node\": \"^20.19.0 || ^22.12.0 || >=24.0.0\",\n        \"npm\": \">=10\"\n      },\n      \"optionalDependencies\": {\n        \"spdy\": \"4.0.2\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/@appium/logger\": {\n      \"version\": \"2.0.6\",\n      \"resolved\": \"https://registry.npmjs.org/@appium/logger/-/logger-2.0.6.tgz\",\n      \"integrity\": \"sha512-9e8n9CtINBwi1ASEU5OyswmR2F7OnbrGfmf9yTy9i+rx4GR9RJlEp0/arsxvuyWCep67tOmM4FiRyXxxHjOK5Q==\",\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"console-control-strings\": \"1.1.0\",\n        \"lodash\": \"4.18.1\",\n        \"lru-cache\": \"11.3.3\",\n        \"set-blocking\": \"2.0.0\"\n      },\n      \"engines\": {\n        \"node\": \"^20.19.0 || ^22.12.0 || >=24.0.0\",\n        \"npm\": \">=10\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/@appium/schema\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/@appium/schema/-/schema-1.1.0.tgz\",\n      \"integrity\": \"sha512-m0vTLU7mhC9RR294Nz84g+FhEQ0iZKq6p3rfz1+qfEqCXRXUvDbllSOu2tCVpBKMIoEFZAmkwjuwXobJpCnilQ==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"json-schema\": \"0.4.0\"\n      },\n      \"engines\": {\n        \"node\": \"^20.19.0 || ^22.12.0 || >=24.0.0\",\n        \"npm\": \">=10\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/@appium/support\": {\n      \"version\": \"7.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/@appium/support/-/support-7.1.0.tgz\",\n      \"integrity\": \"sha512-kY4Qv4TzLCYmZnN2eNptEa8RiRzpbimIQ6tKuDaqLC2Y3q5Al4NumL/xRQAvfXJq/hNezq2Jh8NwciEW8zX/0g==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"@appium/logger\": \"2.0.6\",\n        \"@appium/tsconfig\": \"1.1.2\",\n        \"@appium/types\": \"1.3.0\",\n        \"@colors/colors\": \"1.6.0\",\n        \"archiver\": \"7.0.1\",\n        \"asyncbox\": \"6.1.0\",\n        \"axios\": \"1.15.0\",\n        \"base64-stream\": \"1.0.0\",\n        \"bluebird\": \"3.7.2\",\n        \"bplist-creator\": \"0.1.1\",\n        \"bplist-parser\": \"0.3.2\",\n        \"form-data\": \"4.0.5\",\n        \"get-stream\": \"9.0.1\",\n        \"glob\": \"13.0.6\",\n        \"jsftp\": \"2.1.3\",\n        \"klaw\": \"4.1.0\",\n        \"lockfile\": \"1.0.4\",\n        \"lodash\": \"4.18.1\",\n        \"log-symbols\": \"7.0.1\",\n        \"ncp\": \"2.0.0\",\n        \"package-directory\": \"8.2.0\",\n        \"plist\": \"3.1.0\",\n        \"pluralize\": \"8.0.0\",\n        \"read-pkg\": \"10.1.0\",\n        \"resolve-from\": \"5.0.0\",\n        \"sanitize-filename\": \"1.6.4\",\n        \"semver\": \"7.7.4\",\n        \"shell-quote\": \"1.8.3\",\n        \"supports-color\": \"10.2.2\",\n        \"teen_process\": \"4.1.0\",\n        \"type-fest\": \"5.5.0\",\n        \"uuid\": \"13.0.0\",\n        \"which\": \"6.0.1\",\n        \"yauzl\": \"3.3.0\"\n      },\n      \"engines\": {\n        \"node\": \"^20.19.0 || ^22.12.0 || >=24.0.0\",\n        \"npm\": \">=10\"\n      },\n      \"optionalDependencies\": {\n        \"sharp\": \"0.34.5\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/@appium/tsconfig\": {\n      \"version\": \"1.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/@appium/tsconfig/-/tsconfig-1.1.2.tgz\",\n      \"integrity\": \"sha512-lHKBm7hXCROc1Ha/cBxS4o3iQkeY96Pz7qM9Uh9vFDkdpTGBk56V1lmc3iGcgBYKBlaRT/LZmTsqClvHoiXhvw==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"@tsconfig/node20\": \"20.1.9\"\n      },\n      \"engines\": {\n        \"node\": \"^20.19.0 || ^22.12.0 || >=24.0.0\",\n        \"npm\": \">=10\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/@appium/types\": {\n      \"version\": \"1.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/@appium/types/-/types-1.3.0.tgz\",\n      \"integrity\": \"sha512-Gv4ev/5K5N7TvAHqem2DmB50zipC951QlmCDpuxDNHQl2dtCr20vJgnN8if7upqLcBX/6yNp3udR+f1n99zgcQ==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"@appium/logger\": \"2.0.6\",\n        \"@appium/schema\": \"1.1.0\",\n        \"@appium/tsconfig\": \"1.1.2\",\n        \"type-fest\": \"5.5.0\"\n      },\n      \"engines\": {\n        \"node\": \"^20.19.0 || ^22.12.0 || >=24.0.0\",\n        \"npm\": \">=10\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/@babel/code-frame\": {\n      \"version\": \"7.29.0\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz\",\n      \"integrity\": \"sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@babel/helper-validator-identifier\": \"^7.28.5\",\n        \"js-tokens\": \"^4.0.0\",\n        \"picocolors\": \"^1.1.1\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/@babel/helper-validator-identifier\": {\n      \"version\": \"7.28.5\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz\",\n      \"integrity\": \"sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/@colors/colors\": {\n      \"version\": \"1.6.0\",\n      \"resolved\": \"https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz\",\n      \"integrity\": \"sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=0.1.90\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/@img/colour\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz\",\n      \"integrity\": \"sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==\",\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/@isaacs/cliui\": {\n      \"version\": \"8.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz\",\n      \"integrity\": \"sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==\",\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"string-width\": \"^5.1.2\",\n        \"string-width-cjs\": \"npm:string-width@^4.2.0\",\n        \"strip-ansi\": \"^7.0.1\",\n        \"strip-ansi-cjs\": \"npm:strip-ansi@^6.0.1\",\n        \"wrap-ansi\": \"^8.1.0\",\n        \"wrap-ansi-cjs\": \"npm:wrap-ansi@^7.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/@isaacs/cliui/node_modules/ansi-styles\": {\n      \"version\": \"6.2.3\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz\",\n      \"integrity\": \"sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/ansi-styles?sponsor=1\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/@isaacs/cliui/node_modules/emoji-regex\": {\n      \"version\": \"9.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz\",\n      \"integrity\": \"sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/@isaacs/cliui/node_modules/string-width\": {\n      \"version\": \"5.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz\",\n      \"integrity\": \"sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"eastasianwidth\": \"^0.2.0\",\n        \"emoji-regex\": \"^9.2.2\",\n        \"strip-ansi\": \"^7.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/@isaacs/cliui/node_modules/strip-ansi\": {\n      \"version\": \"7.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz\",\n      \"integrity\": \"sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"ansi-regex\": \"^6.2.2\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/strip-ansi?sponsor=1\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/@isaacs/cliui/node_modules/wrap-ansi\": {\n      \"version\": \"8.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz\",\n      \"integrity\": \"sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"ansi-styles\": \"^6.1.0\",\n        \"string-width\": \"^5.0.1\",\n        \"strip-ansi\": \"^7.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/wrap-ansi?sponsor=1\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/@pkgjs/parseargs\": {\n      \"version\": \"0.11.0\",\n      \"resolved\": \"https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz\",\n      \"integrity\": \"sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==\",\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"engines\": {\n        \"node\": \">=14\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/@sec-ant/readable-stream\": {\n      \"version\": \"0.4.1\",\n      \"resolved\": \"https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz\",\n      \"integrity\": \"sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/@tsconfig/node20\": {\n      \"version\": \"20.1.9\",\n      \"resolved\": \"https://registry.npmjs.org/@tsconfig/node20/-/node20-20.1.9.tgz\",\n      \"integrity\": \"sha512-IjlTv1RsvnPtUcjTqtVsZExKVq+KQx4g5pCP5tI7rAs6Xesl2qFwSz/tPDBC4JajkL/MlezBu3gPUwqRHl+RIg==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/@types/normalize-package-data\": {\n      \"version\": \"2.4.4\",\n      \"resolved\": \"https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz\",\n      \"integrity\": \"sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/@xmldom/xmldom\": {\n      \"version\": \"0.9.9\",\n      \"resolved\": \"https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.9.9.tgz\",\n      \"integrity\": \"sha512-qycIHAucxy/LXAYIjmLmtQ8q9GPnMbnjG1KXhWm9o5sCr6pOYDATkMPiTNa6/v8eELyqOQ2FsEqeoFYmgv/gJg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=14.6\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/abort-controller\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz\",\n      \"integrity\": \"sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"event-target-shim\": \"^5.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6.5\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/accepts\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz\",\n      \"integrity\": \"sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"mime-types\": \"^3.0.0\",\n        \"negotiator\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.6\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/ansi-regex\": {\n      \"version\": \"6.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz\",\n      \"integrity\": \"sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/ansi-regex?sponsor=1\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/ansi-styles\": {\n      \"version\": \"4.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz\",\n      \"integrity\": \"sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"color-convert\": \"^2.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/ansi-styles?sponsor=1\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/appium-adb\": {\n      \"version\": \"14.3.1\",\n      \"resolved\": \"https://registry.npmjs.org/appium-adb/-/appium-adb-14.3.1.tgz\",\n      \"integrity\": \"sha512-Pv9Ti0jji0Q0QewBJfjPiECV5IO6ex5qK6YugZknxxjJ5QadLDjt/FW6z4/THGAQJdbYriwqrxTqLxB6+DwqBA==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"@appium/support\": \"^7.0.0-rc.1\",\n        \"async-lock\": \"^1.0.0\",\n        \"asyncbox\": \"^6.0.1\",\n        \"bluebird\": \"^3.4.7\",\n        \"ini\": \"^6.0.0\",\n        \"lodash\": \"^4.0.0\",\n        \"lru-cache\": \"^11.1.0\",\n        \"semver\": \"^7.0.0\",\n        \"teen_process\": \"^4.0.4\"\n      },\n      \"engines\": {\n        \"node\": \"^20.19.0 || ^22.12.0 || >=24.0.0\",\n        \"npm\": \">=10\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/appium-android-driver\": {\n      \"version\": \"13.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/appium-android-driver/-/appium-android-driver-13.1.1.tgz\",\n      \"integrity\": \"sha512-UZQmkm5YELkuqLE7Rz6wCpXxKhK8WQeDQsFt/9gkOQLgK2yaQdfAj8OM2mP8Gmru3iJFep39VGM2EWYAL2U9Qw==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"@appium/support\": \"^7.0.0-rc.1\",\n        \"@colors/colors\": \"^1.6.0\",\n        \"appium-adb\": \"^14.3.0\",\n        \"appium-chromedriver\": \"^8.2.25\",\n        \"asyncbox\": \"^6.1.0\",\n        \"axios\": \"^1.x\",\n        \"bluebird\": \"^3.4.7\",\n        \"io.appium.settings\": \"^7.0.4\",\n        \"lodash\": \"^4.17.4\",\n        \"lru-cache\": \"^11.1.0\",\n        \"moment\": \"^2.24.0\",\n        \"moment-timezone\": \"^0.x\",\n        \"portscanner\": \"^2.2.0\",\n        \"semver\": \"^7.0.0\",\n        \"teen_process\": \"^4.0.7\",\n        \"ws\": \"^8.0.0\"\n      },\n      \"engines\": {\n        \"node\": \"^20.19.0 || ^22.12.0 || >=24.0.0\",\n        \"npm\": \">=10\"\n      },\n      \"peerDependencies\": {\n        \"appium\": \"^3.0.0-rc.2\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/appium-chromedriver\": {\n      \"version\": \"8.2.25\",\n      \"resolved\": \"https://registry.npmjs.org/appium-chromedriver/-/appium-chromedriver-8.2.25.tgz\",\n      \"integrity\": \"sha512-fxSDBSUwS1hFoHKMneB0YWT5I0X2sGgXu8PbRLKv+CpveKiZKtomqtG+LlWo7zgJfITrJ4/fi6WCYBSpMG05PQ==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"@appium/base-driver\": \"^10.0.0-rc.2\",\n        \"@appium/support\": \"^7.0.0-rc.1\",\n        \"@xmldom/xmldom\": \"^0.x\",\n        \"appium-adb\": \"^14.0.0\",\n        \"asyncbox\": \"^6.0.1\",\n        \"axios\": \"^1.6.5\",\n        \"bluebird\": \"^3.5.1\",\n        \"compare-versions\": \"^6.0.0\",\n        \"lodash\": \"^4.17.4\",\n        \"semver\": \"^7.0.0\",\n        \"teen_process\": \"^4.0.4\",\n        \"xpath\": \"^0.x\"\n      },\n      \"engines\": {\n        \"node\": \"^20.19.0 || ^22.12.0 || >=24.0.0\",\n        \"npm\": \">=10\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/appium-uiautomator2-server\": {\n      \"version\": \"9.11.1\",\n      \"resolved\": \"https://registry.npmjs.org/appium-uiautomator2-server/-/appium-uiautomator2-server-9.11.1.tgz\",\n      \"integrity\": \"sha512-MAlnHFhUdQ/gdpzXcJlK5chuMQLjhOqeoD1gPGmsr3raAElPHdKDYzSiaxqvDFu7XRYug6JfWmBsTSfdASy/RQ==\",\n      \"license\": \"Apache-2.0\",\n      \"engines\": {\n        \"node\": \"^20.19.0 || ^22.12.0 || >=24.0.0\",\n        \"npm\": \">=10\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/archiver\": {\n      \"version\": \"7.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/archiver/-/archiver-7.0.1.tgz\",\n      \"integrity\": \"sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"archiver-utils\": \"^5.0.2\",\n        \"async\": \"^3.2.4\",\n        \"buffer-crc32\": \"^1.0.0\",\n        \"readable-stream\": \"^4.0.0\",\n        \"readdir-glob\": \"^1.1.2\",\n        \"tar-stream\": \"^3.0.0\",\n        \"zip-stream\": \"^6.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 14\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/archiver-utils\": {\n      \"version\": \"5.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/archiver-utils/-/archiver-utils-5.0.2.tgz\",\n      \"integrity\": \"sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"glob\": \"^10.0.0\",\n        \"graceful-fs\": \"^4.2.0\",\n        \"is-stream\": \"^2.0.1\",\n        \"lazystream\": \"^1.0.0\",\n        \"lodash\": \"^4.17.15\",\n        \"normalize-path\": \"^3.0.0\",\n        \"readable-stream\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 14\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/archiver-utils/node_modules/brace-expansion\": {\n      \"version\": \"2.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz\",\n      \"integrity\": \"sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"balanced-match\": \"^1.0.0\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/archiver-utils/node_modules/glob\": {\n      \"version\": \"10.5.0\",\n      \"resolved\": \"https://registry.npmjs.org/glob/-/glob-10.5.0.tgz\",\n      \"integrity\": \"sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==\",\n      \"deprecated\": \"Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me\",\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"foreground-child\": \"^3.1.0\",\n        \"jackspeak\": \"^3.1.2\",\n        \"minimatch\": \"^9.0.4\",\n        \"minipass\": \"^7.1.2\",\n        \"package-json-from-dist\": \"^1.0.0\",\n        \"path-scurry\": \"^1.11.1\"\n      },\n      \"bin\": {\n        \"glob\": \"dist/esm/bin.mjs\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/archiver-utils/node_modules/lru-cache\": {\n      \"version\": \"10.4.3\",\n      \"resolved\": \"https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz\",\n      \"integrity\": \"sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==\",\n      \"license\": \"ISC\"\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/archiver-utils/node_modules/minimatch\": {\n      \"version\": \"9.0.9\",\n      \"resolved\": \"https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz\",\n      \"integrity\": \"sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==\",\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"brace-expansion\": \"^2.0.2\"\n      },\n      \"engines\": {\n        \"node\": \">=16 || 14 >=14.17\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/archiver-utils/node_modules/path-scurry\": {\n      \"version\": \"1.11.1\",\n      \"resolved\": \"https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz\",\n      \"integrity\": \"sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==\",\n      \"license\": \"BlueOak-1.0.0\",\n      \"dependencies\": {\n        \"lru-cache\": \"^10.2.0\",\n        \"minipass\": \"^5.0.0 || ^6.0.2 || ^7.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=16 || 14 >=14.18\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/async\": {\n      \"version\": \"3.2.6\",\n      \"resolved\": \"https://registry.npmjs.org/async/-/async-3.2.6.tgz\",\n      \"integrity\": \"sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/async-lock\": {\n      \"version\": \"1.4.1\",\n      \"resolved\": \"https://registry.npmjs.org/async-lock/-/async-lock-1.4.1.tgz\",\n      \"integrity\": \"sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/asyncbox\": {\n      \"version\": \"6.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/asyncbox/-/asyncbox-6.1.0.tgz\",\n      \"integrity\": \"sha512-KZwKNVnDdDe0ubN+fFMuHhSljZNHnbjdJABImoqFzQP61oIg6sMlhXIqOIu3WRd7YwW89q+eVj2Ty/Ax5dbh2Q==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"p-limit\": \"^7.2.0\"\n      },\n      \"engines\": {\n        \"node\": \"^20.19.0 || ^22.12.0 || >=24.0.0\",\n        \"npm\": \">=10\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/asynckit\": {\n      \"version\": \"0.4.0\",\n      \"resolved\": \"https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz\",\n      \"integrity\": \"sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/axios\": {\n      \"version\": \"1.15.0\",\n      \"resolved\": \"https://registry.npmjs.org/axios/-/axios-1.15.0.tgz\",\n      \"integrity\": \"sha512-wWyJDlAatxk30ZJer+GeCWS209sA42X+N5jU2jy6oHTp7ufw8uzUTVFBX9+wTfAlhiJXGS0Bq7X6efruWjuK9Q==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"follow-redirects\": \"^1.15.11\",\n        \"form-data\": \"^4.0.5\",\n        \"proxy-from-env\": \"^2.1.0\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/b4a\": {\n      \"version\": \"1.8.0\",\n      \"resolved\": \"https://registry.npmjs.org/b4a/-/b4a-1.8.0.tgz\",\n      \"integrity\": \"sha512-qRuSmNSkGQaHwNbM7J78Wwy+ghLEYF1zNrSeMxj4Kgw6y33O3mXcQ6Ie9fRvfU/YnxWkOchPXbaLb73TkIsfdg==\",\n      \"license\": \"Apache-2.0\",\n      \"peerDependencies\": {\n        \"react-native-b4a\": \"*\"\n      },\n      \"peerDependenciesMeta\": {\n        \"react-native-b4a\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/balanced-match\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz\",\n      \"integrity\": \"sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/bare-events\": {\n      \"version\": \"2.8.2\",\n      \"resolved\": \"https://registry.npmjs.org/bare-events/-/bare-events-2.8.2.tgz\",\n      \"integrity\": \"sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==\",\n      \"license\": \"Apache-2.0\",\n      \"peerDependencies\": {\n        \"bare-abort-controller\": \"*\"\n      },\n      \"peerDependenciesMeta\": {\n        \"bare-abort-controller\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/bare-fs\": {\n      \"version\": \"4.7.0\",\n      \"resolved\": \"https://registry.npmjs.org/bare-fs/-/bare-fs-4.7.0.tgz\",\n      \"integrity\": \"sha512-xzqKsCFxAek9aezYhjJuJRXBIaYlg/0OGDTZp+T8eYmYMlm66cs6cYko02drIyjN2CBbi+I6L7YfXyqpqtKRXA==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"bare-events\": \"^2.5.4\",\n        \"bare-path\": \"^3.0.0\",\n        \"bare-stream\": \"^2.6.4\",\n        \"bare-url\": \"^2.2.2\",\n        \"fast-fifo\": \"^1.3.2\"\n      },\n      \"engines\": {\n        \"bare\": \">=1.16.0\"\n      },\n      \"peerDependencies\": {\n        \"bare-buffer\": \"*\"\n      },\n      \"peerDependenciesMeta\": {\n        \"bare-buffer\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/bare-os\": {\n      \"version\": \"3.8.7\",\n      \"resolved\": \"https://registry.npmjs.org/bare-os/-/bare-os-3.8.7.tgz\",\n      \"integrity\": \"sha512-G4Gr1UsGeEy2qtDTZwL7JFLo2wapUarz7iTMcYcMFdS89AIQuBoyjgXZz0Utv7uHs3xA9LckhVbeBi8lEQrC+w==\",\n      \"license\": \"Apache-2.0\",\n      \"engines\": {\n        \"bare\": \">=1.14.0\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/bare-path\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz\",\n      \"integrity\": \"sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"bare-os\": \"^3.0.1\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/bare-stream\": {\n      \"version\": \"2.12.0\",\n      \"resolved\": \"https://registry.npmjs.org/bare-stream/-/bare-stream-2.12.0.tgz\",\n      \"integrity\": \"sha512-w28i8lkBgREV3rPXGbgK+BO66q+ZpKqRWrZLiCdmmUlLPrQ45CzkvRhN+7lnv00Gpi2zy5naRxnUFAxCECDm9g==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"streamx\": \"^2.25.0\",\n        \"teex\": \"^1.0.1\"\n      },\n      \"peerDependencies\": {\n        \"bare-abort-controller\": \"*\",\n        \"bare-buffer\": \"*\",\n        \"bare-events\": \"*\"\n      },\n      \"peerDependenciesMeta\": {\n        \"bare-abort-controller\": {\n          \"optional\": true\n        },\n        \"bare-buffer\": {\n          \"optional\": true\n        },\n        \"bare-events\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/bare-url\": {\n      \"version\": \"2.4.0\",\n      \"resolved\": \"https://registry.npmjs.org/bare-url/-/bare-url-2.4.0.tgz\",\n      \"integrity\": \"sha512-NSTU5WN+fy/L0DDenfE8SXQna4voXuW0FHM7wH8i3/q9khUSchfPbPezO4zSFMnDGIf9YE+mt/RWhZgNRKRIXA==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"bare-path\": \"^3.0.0\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/base64-js\": {\n      \"version\": \"1.5.1\",\n      \"resolved\": \"https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz\",\n      \"integrity\": \"sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==\",\n      \"funding\": [\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/feross\"\n        },\n        {\n          \"type\": \"patreon\",\n          \"url\": \"https://www.patreon.com/feross\"\n        },\n        {\n          \"type\": \"consulting\",\n          \"url\": \"https://feross.org/support\"\n        }\n      ],\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/base64-stream\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/base64-stream/-/base64-stream-1.0.0.tgz\",\n      \"integrity\": \"sha512-BQQZftaO48FcE1Kof9CmXMFaAdqkcNorgc8CxesZv9nMbbTF1EFyQe89UOuh//QMmdtfUDXyO8rgUalemL5ODA==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/basic-auth\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz\",\n      \"integrity\": \"sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"safe-buffer\": \"5.1.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/big-integer\": {\n      \"version\": \"1.6.52\",\n      \"resolved\": \"https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz\",\n      \"integrity\": \"sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==\",\n      \"license\": \"Unlicense\",\n      \"engines\": {\n        \"node\": \">=0.6\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/bluebird\": {\n      \"version\": \"3.7.2\",\n      \"resolved\": \"https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz\",\n      \"integrity\": \"sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/body-parser\": {\n      \"version\": \"2.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz\",\n      \"integrity\": \"sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"bytes\": \"^3.1.2\",\n        \"content-type\": \"^1.0.5\",\n        \"debug\": \"^4.4.3\",\n        \"http-errors\": \"^2.0.0\",\n        \"iconv-lite\": \"^0.7.0\",\n        \"on-finished\": \"^2.4.1\",\n        \"qs\": \"^6.14.1\",\n        \"raw-body\": \"^3.0.1\",\n        \"type-is\": \"^2.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/express\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/bplist-creator\": {\n      \"version\": \"0.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.1.1.tgz\",\n      \"integrity\": \"sha512-Ese7052fdWrxp/vqSJkydgx/1MdBnNOCV2XVfbmdGWD2H6EYza+Q4pyYSuVSnCUD22hfI/BFI4jHaC3NLXLlJQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"stream-buffers\": \"2.2.x\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/bplist-parser\": {\n      \"version\": \"0.3.2\",\n      \"resolved\": \"https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz\",\n      \"integrity\": \"sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"big-integer\": \"1.6.x\"\n      },\n      \"engines\": {\n        \"node\": \">= 5.10.0\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/buffer-crc32\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz\",\n      \"integrity\": \"sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=8.0.0\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/bytes\": {\n      \"version\": \"3.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz\",\n      \"integrity\": \"sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/call-bind-apply-helpers\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz\",\n      \"integrity\": \"sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"es-errors\": \"^1.3.0\",\n        \"function-bind\": \"^1.1.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/call-bound\": {\n      \"version\": \"1.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz\",\n      \"integrity\": \"sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"call-bind-apply-helpers\": \"^1.0.2\",\n        \"get-intrinsic\": \"^1.3.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/color-convert\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz\",\n      \"integrity\": \"sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"color-name\": \"~1.1.4\"\n      },\n      \"engines\": {\n        \"node\": \">=7.0.0\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/color-name\": {\n      \"version\": \"1.1.4\",\n      \"resolved\": \"https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz\",\n      \"integrity\": \"sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/combined-stream\": {\n      \"version\": \"1.0.8\",\n      \"resolved\": \"https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz\",\n      \"integrity\": \"sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"delayed-stream\": \"~1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/compare-versions\": {\n      \"version\": \"6.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.1.tgz\",\n      \"integrity\": \"sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/compress-commons\": {\n      \"version\": \"6.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.2.tgz\",\n      \"integrity\": \"sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"crc-32\": \"^1.2.0\",\n        \"crc32-stream\": \"^6.0.0\",\n        \"is-stream\": \"^2.0.1\",\n        \"normalize-path\": \"^3.0.0\",\n        \"readable-stream\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 14\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/console-control-strings\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz\",\n      \"integrity\": \"sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==\",\n      \"license\": \"ISC\"\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/content-disposition\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/content-disposition/-/content-disposition-1.1.0.tgz\",\n      \"integrity\": \"sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/express\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/content-type\": {\n      \"version\": \"1.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz\",\n      \"integrity\": \"sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.6\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/cookie\": {\n      \"version\": \"0.7.2\",\n      \"resolved\": \"https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz\",\n      \"integrity\": \"sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.6\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/cookie-signature\": {\n      \"version\": \"1.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz\",\n      \"integrity\": \"sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=6.6.0\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/core-util-is\": {\n      \"version\": \"1.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz\",\n      \"integrity\": \"sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/crc-32\": {\n      \"version\": \"1.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz\",\n      \"integrity\": \"sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==\",\n      \"license\": \"Apache-2.0\",\n      \"bin\": {\n        \"crc32\": \"bin/crc32.njs\"\n      },\n      \"engines\": {\n        \"node\": \">=0.8\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/crc32-stream\": {\n      \"version\": \"6.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/crc32-stream/-/crc32-stream-6.0.0.tgz\",\n      \"integrity\": \"sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"crc-32\": \"^1.2.0\",\n        \"readable-stream\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 14\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/cross-spawn\": {\n      \"version\": \"7.0.6\",\n      \"resolved\": \"https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz\",\n      \"integrity\": \"sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"path-key\": \"^3.1.0\",\n        \"shebang-command\": \"^2.0.0\",\n        \"which\": \"^2.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 8\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/cross-spawn/node_modules/isexe\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz\",\n      \"integrity\": \"sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==\",\n      \"license\": \"ISC\"\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/cross-spawn/node_modules/which\": {\n      \"version\": \"2.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/which/-/which-2.0.2.tgz\",\n      \"integrity\": \"sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==\",\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"isexe\": \"^2.0.0\"\n      },\n      \"bin\": {\n        \"node-which\": \"bin/node-which\"\n      },\n      \"engines\": {\n        \"node\": \">= 8\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/css-selector-parser\": {\n      \"version\": \"3.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/css-selector-parser/-/css-selector-parser-3.3.0.tgz\",\n      \"integrity\": \"sha512-Y2asgMGFqJKF4fq4xHDSlFYIkeVfRsm69lQC1q9kbEsH5XtnINTMrweLkjYMeaUgiXBy/uvKeO/a1JHTNnmB2g==\",\n      \"funding\": [\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/mdevils\"\n        },\n        {\n          \"type\": \"patreon\",\n          \"url\": \"https://patreon.com/mdevils\"\n        }\n      ],\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/debug\": {\n      \"version\": \"4.4.3\",\n      \"resolved\": \"https://registry.npmjs.org/debug/-/debug-4.4.3.tgz\",\n      \"integrity\": \"sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"ms\": \"^2.1.3\"\n      },\n      \"engines\": {\n        \"node\": \">=6.0\"\n      },\n      \"peerDependenciesMeta\": {\n        \"supports-color\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/delayed-stream\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz\",\n      \"integrity\": \"sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=0.4.0\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/depd\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/depd/-/depd-2.0.0.tgz\",\n      \"integrity\": \"sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/detect-libc\": {\n      \"version\": \"2.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz\",\n      \"integrity\": \"sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==\",\n      \"license\": \"Apache-2.0\",\n      \"optional\": true,\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/detect-node\": {\n      \"version\": \"2.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz\",\n      \"integrity\": \"sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==\",\n      \"license\": \"MIT\",\n      \"optional\": true\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/dunder-proto\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz\",\n      \"integrity\": \"sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"call-bind-apply-helpers\": \"^1.0.1\",\n        \"es-errors\": \"^1.3.0\",\n        \"gopd\": \"^1.2.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/duplexer\": {\n      \"version\": \"0.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz\",\n      \"integrity\": \"sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/eastasianwidth\": {\n      \"version\": \"0.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz\",\n      \"integrity\": \"sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/ee-first\": {\n      \"version\": \"1.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz\",\n      \"integrity\": \"sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/emoji-regex\": {\n      \"version\": \"8.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz\",\n      \"integrity\": \"sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/encodeurl\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz\",\n      \"integrity\": \"sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/es-define-property\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz\",\n      \"integrity\": \"sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/es-errors\": {\n      \"version\": \"1.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz\",\n      \"integrity\": \"sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/es-object-atoms\": {\n      \"version\": \"1.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz\",\n      \"integrity\": \"sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"es-errors\": \"^1.3.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/es-set-tostringtag\": {\n      \"version\": \"2.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz\",\n      \"integrity\": \"sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"es-errors\": \"^1.3.0\",\n        \"get-intrinsic\": \"^1.2.6\",\n        \"has-tostringtag\": \"^1.0.2\",\n        \"hasown\": \"^2.0.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/escape-html\": {\n      \"version\": \"1.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz\",\n      \"integrity\": \"sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/etag\": {\n      \"version\": \"1.8.1\",\n      \"resolved\": \"https://registry.npmjs.org/etag/-/etag-1.8.1.tgz\",\n      \"integrity\": \"sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.6\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/event-target-shim\": {\n      \"version\": \"5.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz\",\n      \"integrity\": \"sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/events\": {\n      \"version\": \"3.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/events/-/events-3.3.0.tgz\",\n      \"integrity\": \"sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=0.8.x\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/events-universal\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz\",\n      \"integrity\": \"sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"bare-events\": \"^2.7.0\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/express\": {\n      \"version\": \"5.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/express/-/express-5.2.1.tgz\",\n      \"integrity\": \"sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"accepts\": \"^2.0.0\",\n        \"body-parser\": \"^2.2.1\",\n        \"content-disposition\": \"^1.0.0\",\n        \"content-type\": \"^1.0.5\",\n        \"cookie\": \"^0.7.1\",\n        \"cookie-signature\": \"^1.2.1\",\n        \"debug\": \"^4.4.0\",\n        \"depd\": \"^2.0.0\",\n        \"encodeurl\": \"^2.0.0\",\n        \"escape-html\": \"^1.0.3\",\n        \"etag\": \"^1.8.1\",\n        \"finalhandler\": \"^2.1.0\",\n        \"fresh\": \"^2.0.0\",\n        \"http-errors\": \"^2.0.0\",\n        \"merge-descriptors\": \"^2.0.0\",\n        \"mime-types\": \"^3.0.0\",\n        \"on-finished\": \"^2.4.1\",\n        \"once\": \"^1.4.0\",\n        \"parseurl\": \"^1.3.3\",\n        \"proxy-addr\": \"^2.0.7\",\n        \"qs\": \"^6.14.0\",\n        \"range-parser\": \"^1.2.1\",\n        \"router\": \"^2.2.0\",\n        \"send\": \"^1.1.0\",\n        \"serve-static\": \"^2.2.0\",\n        \"statuses\": \"^2.0.1\",\n        \"type-is\": \"^2.0.1\",\n        \"vary\": \"^1.1.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 18\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/express\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/fast-fifo\": {\n      \"version\": \"1.3.2\",\n      \"resolved\": \"https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz\",\n      \"integrity\": \"sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/fastest-levenshtein\": {\n      \"version\": \"1.0.16\",\n      \"resolved\": \"https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz\",\n      \"integrity\": \"sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 4.9.1\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/finalhandler\": {\n      \"version\": \"2.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz\",\n      \"integrity\": \"sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"debug\": \"^4.4.0\",\n        \"encodeurl\": \"^2.0.0\",\n        \"escape-html\": \"^1.0.3\",\n        \"on-finished\": \"^2.4.1\",\n        \"parseurl\": \"^1.3.3\",\n        \"statuses\": \"^2.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 18.0.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/express\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/find-up-simple\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.1.tgz\",\n      \"integrity\": \"sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/follow-redirects\": {\n      \"version\": \"1.15.11\",\n      \"resolved\": \"https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz\",\n      \"integrity\": \"sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==\",\n      \"funding\": [\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://github.com/sponsors/RubenVerborgh\"\n        }\n      ],\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=4.0\"\n      },\n      \"peerDependenciesMeta\": {\n        \"debug\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/foreground-child\": {\n      \"version\": \"3.3.1\",\n      \"resolved\": \"https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz\",\n      \"integrity\": \"sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==\",\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"cross-spawn\": \"^7.0.6\",\n        \"signal-exit\": \"^4.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=14\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/foreground-child/node_modules/signal-exit\": {\n      \"version\": \"4.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz\",\n      \"integrity\": \"sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==\",\n      \"license\": \"ISC\",\n      \"engines\": {\n        \"node\": \">=14\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/form-data\": {\n      \"version\": \"4.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz\",\n      \"integrity\": \"sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"asynckit\": \"^0.4.0\",\n        \"combined-stream\": \"^1.0.8\",\n        \"es-set-tostringtag\": \"^2.1.0\",\n        \"hasown\": \"^2.0.2\",\n        \"mime-types\": \"^2.1.12\"\n      },\n      \"engines\": {\n        \"node\": \">= 6\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/form-data/node_modules/mime-db\": {\n      \"version\": \"1.52.0\",\n      \"resolved\": \"https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz\",\n      \"integrity\": \"sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.6\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/form-data/node_modules/mime-types\": {\n      \"version\": \"2.1.35\",\n      \"resolved\": \"https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz\",\n      \"integrity\": \"sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"mime-db\": \"1.52.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.6\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/forwarded\": {\n      \"version\": \"0.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz\",\n      \"integrity\": \"sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.6\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/fresh\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz\",\n      \"integrity\": \"sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/ftp-response-parser\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/ftp-response-parser/-/ftp-response-parser-1.0.1.tgz\",\n      \"integrity\": \"sha512-++Ahlo2hs/IC7UVQzjcSAfeUpCwTTzs4uvG5XfGnsinIFkWUYF4xWwPd5qZuK8MJrmUIxFMuHcfqaosCDjvIWw==\",\n      \"dependencies\": {\n        \"readable-stream\": \"^1.0.31\"\n      },\n      \"engines\": {\n        \"node\": \">=0.8.0\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/ftp-response-parser/node_modules/isarray\": {\n      \"version\": \"0.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz\",\n      \"integrity\": \"sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/ftp-response-parser/node_modules/readable-stream\": {\n      \"version\": \"1.1.14\",\n      \"resolved\": \"https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz\",\n      \"integrity\": \"sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"core-util-is\": \"~1.0.0\",\n        \"inherits\": \"~2.0.1\",\n        \"isarray\": \"0.0.1\",\n        \"string_decoder\": \"~0.10.x\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/ftp-response-parser/node_modules/string_decoder\": {\n      \"version\": \"0.10.31\",\n      \"resolved\": \"https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz\",\n      \"integrity\": \"sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/function-bind\": {\n      \"version\": \"1.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz\",\n      \"integrity\": \"sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==\",\n      \"license\": \"MIT\",\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/get-intrinsic\": {\n      \"version\": \"1.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz\",\n      \"integrity\": \"sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"call-bind-apply-helpers\": \"^1.0.2\",\n        \"es-define-property\": \"^1.0.1\",\n        \"es-errors\": \"^1.3.0\",\n        \"es-object-atoms\": \"^1.1.1\",\n        \"function-bind\": \"^1.1.2\",\n        \"get-proto\": \"^1.0.1\",\n        \"gopd\": \"^1.2.0\",\n        \"has-symbols\": \"^1.1.0\",\n        \"hasown\": \"^2.0.2\",\n        \"math-intrinsics\": \"^1.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/get-proto\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz\",\n      \"integrity\": \"sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"dunder-proto\": \"^1.0.1\",\n        \"es-object-atoms\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/get-stream\": {\n      \"version\": \"9.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz\",\n      \"integrity\": \"sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@sec-ant/readable-stream\": \"^0.4.1\",\n        \"is-stream\": \"^4.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/get-stream/node_modules/is-stream\": {\n      \"version\": \"4.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz\",\n      \"integrity\": \"sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/glob\": {\n      \"version\": \"13.0.6\",\n      \"resolved\": \"https://registry.npmjs.org/glob/-/glob-13.0.6.tgz\",\n      \"integrity\": \"sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==\",\n      \"license\": \"BlueOak-1.0.0\",\n      \"dependencies\": {\n        \"minimatch\": \"^10.2.2\",\n        \"minipass\": \"^7.1.3\",\n        \"path-scurry\": \"^2.0.2\"\n      },\n      \"engines\": {\n        \"node\": \"18 || 20 || >=22\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/glob/node_modules/balanced-match\": {\n      \"version\": \"4.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz\",\n      \"integrity\": \"sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \"18 || 20 || >=22\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/glob/node_modules/brace-expansion\": {\n      \"version\": \"5.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz\",\n      \"integrity\": \"sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"balanced-match\": \"^4.0.2\"\n      },\n      \"engines\": {\n        \"node\": \"18 || 20 || >=22\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/glob/node_modules/minimatch\": {\n      \"version\": \"10.2.5\",\n      \"resolved\": \"https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz\",\n      \"integrity\": \"sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==\",\n      \"license\": \"BlueOak-1.0.0\",\n      \"dependencies\": {\n        \"brace-expansion\": \"^5.0.5\"\n      },\n      \"engines\": {\n        \"node\": \"18 || 20 || >=22\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/gopd\": {\n      \"version\": \"1.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz\",\n      \"integrity\": \"sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/graceful-fs\": {\n      \"version\": \"4.2.11\",\n      \"resolved\": \"https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz\",\n      \"integrity\": \"sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==\",\n      \"license\": \"ISC\"\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/handle-thing\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz\",\n      \"integrity\": \"sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==\",\n      \"license\": \"MIT\",\n      \"optional\": true\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/has-symbols\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz\",\n      \"integrity\": \"sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/has-tostringtag\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz\",\n      \"integrity\": \"sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"has-symbols\": \"^1.0.3\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/hasown\": {\n      \"version\": \"2.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz\",\n      \"integrity\": \"sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"function-bind\": \"^1.1.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/hosted-git-info\": {\n      \"version\": \"9.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-9.0.2.tgz\",\n      \"integrity\": \"sha512-M422h7o/BR3rmCQ8UHi7cyyMqKltdP9Uo+J2fXK+RSAY+wTcKOIRyhTuKv4qn+DJf3g+PL890AzId5KZpX+CBg==\",\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"lru-cache\": \"^11.1.0\"\n      },\n      \"engines\": {\n        \"node\": \"^20.17.0 || >=22.9.0\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/hpack.js\": {\n      \"version\": \"2.1.6\",\n      \"resolved\": \"https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz\",\n      \"integrity\": \"sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==\",\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"dependencies\": {\n        \"inherits\": \"^2.0.1\",\n        \"obuf\": \"^1.0.0\",\n        \"readable-stream\": \"^2.0.1\",\n        \"wbuf\": \"^1.1.0\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/hpack.js/node_modules/readable-stream\": {\n      \"version\": \"2.3.8\",\n      \"resolved\": \"https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz\",\n      \"integrity\": \"sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==\",\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"dependencies\": {\n        \"core-util-is\": \"~1.0.0\",\n        \"inherits\": \"~2.0.3\",\n        \"isarray\": \"~1.0.0\",\n        \"process-nextick-args\": \"~2.0.0\",\n        \"safe-buffer\": \"~5.1.1\",\n        \"string_decoder\": \"~1.1.1\",\n        \"util-deprecate\": \"~1.0.1\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/hpack.js/node_modules/string_decoder\": {\n      \"version\": \"1.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz\",\n      \"integrity\": \"sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==\",\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"dependencies\": {\n        \"safe-buffer\": \"~5.1.0\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/http-deceiver\": {\n      \"version\": \"1.2.7\",\n      \"resolved\": \"https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz\",\n      \"integrity\": \"sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==\",\n      \"license\": \"MIT\",\n      \"optional\": true\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/http-errors\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz\",\n      \"integrity\": \"sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"depd\": \"~2.0.0\",\n        \"inherits\": \"~2.0.4\",\n        \"setprototypeof\": \"~1.2.0\",\n        \"statuses\": \"~2.0.2\",\n        \"toidentifier\": \"~1.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/express\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/http-status-codes\": {\n      \"version\": \"2.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/http-status-codes/-/http-status-codes-2.3.0.tgz\",\n      \"integrity\": \"sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/iconv-lite\": {\n      \"version\": \"0.7.2\",\n      \"resolved\": \"https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz\",\n      \"integrity\": \"sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"safer-buffer\": \">= 2.1.2 < 3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/express\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/ieee754\": {\n      \"version\": \"1.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz\",\n      \"integrity\": \"sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==\",\n      \"funding\": [\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/feross\"\n        },\n        {\n          \"type\": \"patreon\",\n          \"url\": \"https://www.patreon.com/feross\"\n        },\n        {\n          \"type\": \"consulting\",\n          \"url\": \"https://feross.org/support\"\n        }\n      ],\n      \"license\": \"BSD-3-Clause\"\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/index-to-position\": {\n      \"version\": \"1.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/index-to-position/-/index-to-position-1.2.0.tgz\",\n      \"integrity\": \"sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/inherits\": {\n      \"version\": \"2.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz\",\n      \"integrity\": \"sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==\",\n      \"license\": \"ISC\"\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/ini\": {\n      \"version\": \"6.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/ini/-/ini-6.0.0.tgz\",\n      \"integrity\": \"sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==\",\n      \"license\": \"ISC\",\n      \"engines\": {\n        \"node\": \"^20.17.0 || >=22.9.0\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/io.appium.settings\": {\n      \"version\": \"7.0.22\",\n      \"resolved\": \"https://registry.npmjs.org/io.appium.settings/-/io.appium.settings-7.0.22.tgz\",\n      \"integrity\": \"sha512-LBKquRGIRfYG9qk8Y2CkOhuk4dDRSGNzcPoMy5a2/lopTpHPvJz+FQOXfcPVQ23qgbCE7GJH7chYKvlJrFOPZA==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"@appium/logger\": \"^2.0.0-rc.1\",\n        \"asyncbox\": \"^6.0.1\",\n        \"bluebird\": \"^3.5.1\",\n        \"lodash\": \"^4.2.1\",\n        \"semver\": \"^7.5.4\",\n        \"teen_process\": \"^4.0.4\"\n      },\n      \"engines\": {\n        \"node\": \"^20.19.0 || ^22.12.0 || >=24.0.0\",\n        \"npm\": \">=10\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/ipaddr.js\": {\n      \"version\": \"1.9.1\",\n      \"resolved\": \"https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz\",\n      \"integrity\": \"sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.10\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/is-fullwidth-code-point\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz\",\n      \"integrity\": \"sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/is-number-like\": {\n      \"version\": \"1.0.8\",\n      \"resolved\": \"https://registry.npmjs.org/is-number-like/-/is-number-like-1.0.8.tgz\",\n      \"integrity\": \"sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==\",\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"lodash.isfinite\": \"^3.3.2\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/is-promise\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz\",\n      \"integrity\": \"sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/is-stream\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz\",\n      \"integrity\": \"sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=8\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/is-unicode-supported\": {\n      \"version\": \"2.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz\",\n      \"integrity\": \"sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/isarray\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz\",\n      \"integrity\": \"sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/isexe\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/isexe/-/isexe-4.0.0.tgz\",\n      \"integrity\": \"sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==\",\n      \"license\": \"BlueOak-1.0.0\",\n      \"engines\": {\n        \"node\": \">=20\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/jackspeak\": {\n      \"version\": \"3.4.3\",\n      \"resolved\": \"https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz\",\n      \"integrity\": \"sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==\",\n      \"license\": \"BlueOak-1.0.0\",\n      \"dependencies\": {\n        \"@isaacs/cliui\": \"^8.0.2\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      },\n      \"optionalDependencies\": {\n        \"@pkgjs/parseargs\": \"^0.11.0\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/js-tokens\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz\",\n      \"integrity\": \"sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/jsftp\": {\n      \"version\": \"2.1.3\",\n      \"resolved\": \"https://registry.npmjs.org/jsftp/-/jsftp-2.1.3.tgz\",\n      \"integrity\": \"sha512-r79EVB8jaNAZbq8hvanL8e8JGu2ZNr2bXdHC4ZdQhRImpSPpnWwm5DYVzQ5QxJmtGtKhNNuvqGgbNaFl604fEQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"debug\": \"^3.1.0\",\n        \"ftp-response-parser\": \"^1.0.1\",\n        \"once\": \"^1.4.0\",\n        \"parse-listing\": \"^1.1.3\",\n        \"stream-combiner\": \"^0.2.2\",\n        \"unorm\": \"^1.4.1\"\n      },\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/jsftp/node_modules/debug\": {\n      \"version\": \"3.2.7\",\n      \"resolved\": \"https://registry.npmjs.org/debug/-/debug-3.2.7.tgz\",\n      \"integrity\": \"sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"ms\": \"^2.1.1\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/json-schema\": {\n      \"version\": \"0.4.0\",\n      \"resolved\": \"https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz\",\n      \"integrity\": \"sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==\",\n      \"license\": \"(AFL-2.1 OR BSD-3-Clause)\"\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/klaw\": {\n      \"version\": \"4.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/klaw/-/klaw-4.1.0.tgz\",\n      \"integrity\": \"sha512-1zGZ9MF9H22UnkpVeuaGKOjfA2t6WrfdrJmGjy16ykcjnKQDmHVX+KI477rpbGevz/5FD4MC3xf1oxylBgcaQw==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=14.14.0\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/lazystream\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz\",\n      \"integrity\": \"sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"readable-stream\": \"^2.0.5\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.6.3\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/lazystream/node_modules/readable-stream\": {\n      \"version\": \"2.3.8\",\n      \"resolved\": \"https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz\",\n      \"integrity\": \"sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"core-util-is\": \"~1.0.0\",\n        \"inherits\": \"~2.0.3\",\n        \"isarray\": \"~1.0.0\",\n        \"process-nextick-args\": \"~2.0.0\",\n        \"safe-buffer\": \"~5.1.1\",\n        \"string_decoder\": \"~1.1.1\",\n        \"util-deprecate\": \"~1.0.1\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/lazystream/node_modules/string_decoder\": {\n      \"version\": \"1.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz\",\n      \"integrity\": \"sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"safe-buffer\": \"~5.1.0\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/lockfile\": {\n      \"version\": \"1.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/lockfile/-/lockfile-1.0.4.tgz\",\n      \"integrity\": \"sha512-cvbTwETRfsFh4nHsL1eGWapU1XFi5Ot9E85sWAwia7Y7EgB7vfqcZhTKZ+l7hCGxSPoushMv5GKhT5PdLv03WA==\",\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"signal-exit\": \"^3.0.2\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/lodash\": {\n      \"version\": \"4.18.1\",\n      \"resolved\": \"https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz\",\n      \"integrity\": \"sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/lodash.isfinite\": {\n      \"version\": \"3.3.2\",\n      \"resolved\": \"https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz\",\n      \"integrity\": \"sha512-7FGG40uhC8Mm633uKW1r58aElFlBlxCrg9JfSi3P6aYiWmfiWF0PgMd86ZUsxE5GwWPdHoS2+48bwTh2VPkIQA==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/log-symbols\": {\n      \"version\": \"7.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/log-symbols/-/log-symbols-7.0.1.tgz\",\n      \"integrity\": \"sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"is-unicode-supported\": \"^2.0.0\",\n        \"yoctocolors\": \"^2.1.1\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/lru-cache\": {\n      \"version\": \"11.3.3\",\n      \"resolved\": \"https://registry.npmjs.org/lru-cache/-/lru-cache-11.3.3.tgz\",\n      \"integrity\": \"sha512-JvNw9Y81y33E+BEYPr0U7omo+U9AySnsMsEiXgwT6yqd31VQWTLNQqmT4ou5eqPFUrTfIDFta2wKhB1hyohtAQ==\",\n      \"license\": \"BlueOak-1.0.0\",\n      \"engines\": {\n        \"node\": \"20 || >=22\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/math-intrinsics\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz\",\n      \"integrity\": \"sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/media-typer\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz\",\n      \"integrity\": \"sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/merge-descriptors\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz\",\n      \"integrity\": \"sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/method-override\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/method-override/-/method-override-3.0.0.tgz\",\n      \"integrity\": \"sha512-IJ2NNN/mSl9w3kzWB92rcdHpz+HjkxhDJWNDBqSlas+zQdP8wBiJzITPg08M/k2uVvMow7Sk41atndNtt/PHSA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"debug\": \"3.1.0\",\n        \"methods\": \"~1.1.2\",\n        \"parseurl\": \"~1.3.2\",\n        \"vary\": \"~1.1.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.10\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/method-override/node_modules/debug\": {\n      \"version\": \"3.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/debug/-/debug-3.1.0.tgz\",\n      \"integrity\": \"sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"ms\": \"2.0.0\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/method-override/node_modules/ms\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/ms/-/ms-2.0.0.tgz\",\n      \"integrity\": \"sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/methods\": {\n      \"version\": \"1.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/methods/-/methods-1.1.2.tgz\",\n      \"integrity\": \"sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.6\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/mime-db\": {\n      \"version\": \"1.54.0\",\n      \"resolved\": \"https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz\",\n      \"integrity\": \"sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.6\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/mime-types\": {\n      \"version\": \"3.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz\",\n      \"integrity\": \"sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"mime-db\": \"^1.54.0\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/express\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/minimalistic-assert\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz\",\n      \"integrity\": \"sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==\",\n      \"license\": \"ISC\",\n      \"optional\": true\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/minipass\": {\n      \"version\": \"7.1.3\",\n      \"resolved\": \"https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz\",\n      \"integrity\": \"sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==\",\n      \"license\": \"BlueOak-1.0.0\",\n      \"engines\": {\n        \"node\": \">=16 || 14 >=14.17\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/moment\": {\n      \"version\": \"2.30.1\",\n      \"resolved\": \"https://registry.npmjs.org/moment/-/moment-2.30.1.tgz\",\n      \"integrity\": \"sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \"*\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/moment-timezone\": {\n      \"version\": \"0.6.1\",\n      \"resolved\": \"https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.6.1.tgz\",\n      \"integrity\": \"sha512-1B9lmAhB9D9/sHaPC1N7wLFEVUoFldxOpOO96lOD1PvJ43vCd0ozDPbu0FEL3++VvawOlDkq8YD373tJmP5JHw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"moment\": \"^2.29.4\"\n      },\n      \"engines\": {\n        \"node\": \"*\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/morgan\": {\n      \"version\": \"1.10.1\",\n      \"resolved\": \"https://registry.npmjs.org/morgan/-/morgan-1.10.1.tgz\",\n      \"integrity\": \"sha512-223dMRJtI/l25dJKWpgij2cMtywuG/WiUKXdvwfbhGKBhy1puASqXwFzmWZ7+K73vUPoR7SS2Qz2cI/g9MKw0A==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"basic-auth\": \"~2.0.1\",\n        \"debug\": \"2.6.9\",\n        \"depd\": \"~2.0.0\",\n        \"on-finished\": \"~2.3.0\",\n        \"on-headers\": \"~1.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.8.0\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/morgan/node_modules/debug\": {\n      \"version\": \"2.6.9\",\n      \"resolved\": \"https://registry.npmjs.org/debug/-/debug-2.6.9.tgz\",\n      \"integrity\": \"sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"ms\": \"2.0.0\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/morgan/node_modules/ms\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/ms/-/ms-2.0.0.tgz\",\n      \"integrity\": \"sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/morgan/node_modules/on-finished\": {\n      \"version\": \"2.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz\",\n      \"integrity\": \"sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"ee-first\": \"1.1.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/ms\": {\n      \"version\": \"2.1.3\",\n      \"resolved\": \"https://registry.npmjs.org/ms/-/ms-2.1.3.tgz\",\n      \"integrity\": \"sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/ncp\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz\",\n      \"integrity\": \"sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==\",\n      \"license\": \"MIT\",\n      \"bin\": {\n        \"ncp\": \"bin/ncp\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/negotiator\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz\",\n      \"integrity\": \"sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.6\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/normalize-package-data\": {\n      \"version\": \"8.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-8.0.0.tgz\",\n      \"integrity\": \"sha512-RWk+PI433eESQ7ounYxIp67CYuVsS1uYSonX3kA6ps/3LWfjVQa/ptEg6Y3T6uAMq1mWpX9PQ+qx+QaHpsc7gQ==\",\n      \"license\": \"BSD-2-Clause\",\n      \"dependencies\": {\n        \"hosted-git-info\": \"^9.0.0\",\n        \"semver\": \"^7.3.5\",\n        \"validate-npm-package-license\": \"^3.0.4\"\n      },\n      \"engines\": {\n        \"node\": \"^20.17.0 || >=22.9.0\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/normalize-path\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz\",\n      \"integrity\": \"sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/object-inspect\": {\n      \"version\": \"1.13.4\",\n      \"resolved\": \"https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz\",\n      \"integrity\": \"sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/obuf\": {\n      \"version\": \"1.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz\",\n      \"integrity\": \"sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==\",\n      \"license\": \"MIT\",\n      \"optional\": true\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/on-finished\": {\n      \"version\": \"2.4.1\",\n      \"resolved\": \"https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz\",\n      \"integrity\": \"sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"ee-first\": \"1.1.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/on-headers\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz\",\n      \"integrity\": \"sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/once\": {\n      \"version\": \"1.4.0\",\n      \"resolved\": \"https://registry.npmjs.org/once/-/once-1.4.0.tgz\",\n      \"integrity\": \"sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==\",\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"wrappy\": \"1\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/p-limit\": {\n      \"version\": \"7.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/p-limit/-/p-limit-7.3.0.tgz\",\n      \"integrity\": \"sha512-7cIXg/Z0M5WZRblrsOla88S4wAK+zOQQWeBYfV3qJuJXMr+LnbYjaadrFaS0JILfEDPVqHyKnZ1Z/1d6J9VVUw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"yocto-queue\": \"^1.2.1\"\n      },\n      \"engines\": {\n        \"node\": \">=20\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/package-directory\": {\n      \"version\": \"8.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/package-directory/-/package-directory-8.2.0.tgz\",\n      \"integrity\": \"sha512-qJSu5Mo6tHmRxCy2KCYYKYgcfBdUpy9dwReaZD/xwf608AUk/MoRtIOWzgDtUeGeC7n/55yC3MI1Q+MbSoektw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"find-up-simple\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/package-json-from-dist\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz\",\n      \"integrity\": \"sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==\",\n      \"license\": \"BlueOak-1.0.0\"\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/parse-json\": {\n      \"version\": \"8.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/parse-json/-/parse-json-8.3.0.tgz\",\n      \"integrity\": \"sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@babel/code-frame\": \"^7.26.2\",\n        \"index-to-position\": \"^1.1.0\",\n        \"type-fest\": \"^4.39.1\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/parse-json/node_modules/type-fest\": {\n      \"version\": \"4.41.0\",\n      \"resolved\": \"https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz\",\n      \"integrity\": \"sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==\",\n      \"license\": \"(MIT OR CC0-1.0)\",\n      \"engines\": {\n        \"node\": \">=16\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/parse-listing\": {\n      \"version\": \"1.1.3\",\n      \"resolved\": \"https://registry.npmjs.org/parse-listing/-/parse-listing-1.1.3.tgz\",\n      \"integrity\": \"sha512-a1p1i+9Qyc8pJNwdrSvW1g5TPxRH0sywVi6OzVvYHRo6xwF9bDWBxtH0KkxeOOvhUE8vAMtiSfsYQFOuK901eA==\",\n      \"engines\": {\n        \"node\": \">=0.6.21\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/parseurl\": {\n      \"version\": \"1.3.3\",\n      \"resolved\": \"https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz\",\n      \"integrity\": \"sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/path-key\": {\n      \"version\": \"3.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz\",\n      \"integrity\": \"sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/path-scurry\": {\n      \"version\": \"2.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz\",\n      \"integrity\": \"sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==\",\n      \"license\": \"BlueOak-1.0.0\",\n      \"dependencies\": {\n        \"lru-cache\": \"^11.0.0\",\n        \"minipass\": \"^7.1.2\"\n      },\n      \"engines\": {\n        \"node\": \"18 || 20 || >=22\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/path-to-regexp\": {\n      \"version\": \"8.4.2\",\n      \"resolved\": \"https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.4.2.tgz\",\n      \"integrity\": \"sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==\",\n      \"license\": \"MIT\",\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/express\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/pend\": {\n      \"version\": \"1.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/pend/-/pend-1.2.0.tgz\",\n      \"integrity\": \"sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/picocolors\": {\n      \"version\": \"1.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz\",\n      \"integrity\": \"sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==\",\n      \"license\": \"ISC\"\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/plist\": {\n      \"version\": \"3.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/plist/-/plist-3.1.0.tgz\",\n      \"integrity\": \"sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@xmldom/xmldom\": \"^0.8.8\",\n        \"base64-js\": \"^1.5.1\",\n        \"xmlbuilder\": \"^15.1.1\"\n      },\n      \"engines\": {\n        \"node\": \">=10.4.0\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/plist/node_modules/@xmldom/xmldom\": {\n      \"version\": \"0.8.12\",\n      \"resolved\": \"https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.12.tgz\",\n      \"integrity\": \"sha512-9k/gHF6n/pAi/9tqr3m3aqkuiNosYTurLLUtc7xQ9sxB/wm7WPygCv8GYa6mS0fLJEHhqMC1ATYhz++U/lRHqg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=10.0.0\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/pluralize\": {\n      \"version\": \"8.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz\",\n      \"integrity\": \"sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/portscanner\": {\n      \"version\": \"2.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/portscanner/-/portscanner-2.2.0.tgz\",\n      \"integrity\": \"sha512-IFroCz/59Lqa2uBvzK3bKDbDDIEaAY8XJ1jFxcLWTqosrsc32//P4VuSB2vZXoHiHqOmx8B5L5hnKOxL/7FlPw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"async\": \"^2.6.0\",\n        \"is-number-like\": \"^1.0.3\"\n      },\n      \"engines\": {\n        \"node\": \">=0.4\",\n        \"npm\": \">=1.0.0\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/portscanner/node_modules/async\": {\n      \"version\": \"2.6.4\",\n      \"resolved\": \"https://registry.npmjs.org/async/-/async-2.6.4.tgz\",\n      \"integrity\": \"sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"lodash\": \"^4.17.14\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/process\": {\n      \"version\": \"0.11.10\",\n      \"resolved\": \"https://registry.npmjs.org/process/-/process-0.11.10.tgz\",\n      \"integrity\": \"sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.6.0\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/process-nextick-args\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz\",\n      \"integrity\": \"sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/proxy-addr\": {\n      \"version\": \"2.0.7\",\n      \"resolved\": \"https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz\",\n      \"integrity\": \"sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"forwarded\": \"0.2.0\",\n        \"ipaddr.js\": \"1.9.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.10\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/proxy-from-env\": {\n      \"version\": \"2.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz\",\n      \"integrity\": \"sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/qs\": {\n      \"version\": \"6.15.1\",\n      \"resolved\": \"https://registry.npmjs.org/qs/-/qs-6.15.1.tgz\",\n      \"integrity\": \"sha512-6YHEFRL9mfgcAvql/XhwTvf5jKcOiiupt2FiJxHkiX1z4j7WL8J/jRHYLluORvc1XxB5rV20KoeK00gVJamspg==\",\n      \"license\": \"BSD-3-Clause\",\n      \"dependencies\": {\n        \"side-channel\": \"^1.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">=0.6\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/range-parser\": {\n      \"version\": \"1.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz\",\n      \"integrity\": \"sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.6\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/raw-body\": {\n      \"version\": \"3.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz\",\n      \"integrity\": \"sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"bytes\": \"~3.1.2\",\n        \"http-errors\": \"~2.0.1\",\n        \"iconv-lite\": \"~0.7.0\",\n        \"unpipe\": \"~1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.10\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/read-pkg\": {\n      \"version\": \"10.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/read-pkg/-/read-pkg-10.1.0.tgz\",\n      \"integrity\": \"sha512-I8g2lArQiP78ll51UeMZojewtYgIRCKCWqZEgOO8c/uefTI+XDXvCSXu3+YNUaTNvZzobrL5+SqHjBrByRRTdg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@types/normalize-package-data\": \"^2.4.4\",\n        \"normalize-package-data\": \"^8.0.0\",\n        \"parse-json\": \"^8.3.0\",\n        \"type-fest\": \"^5.4.4\",\n        \"unicorn-magic\": \"^0.4.0\"\n      },\n      \"engines\": {\n        \"node\": \">=20\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/readable-stream\": {\n      \"version\": \"4.7.0\",\n      \"resolved\": \"https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz\",\n      \"integrity\": \"sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"abort-controller\": \"^3.0.0\",\n        \"buffer\": \"^6.0.3\",\n        \"events\": \"^3.3.0\",\n        \"process\": \"^0.11.10\",\n        \"string_decoder\": \"^1.3.0\"\n      },\n      \"engines\": {\n        \"node\": \"^12.22.0 || ^14.17.0 || >=16.0.0\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/readable-stream/node_modules/buffer\": {\n      \"version\": \"6.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz\",\n      \"integrity\": \"sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==\",\n      \"funding\": [\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/feross\"\n        },\n        {\n          \"type\": \"patreon\",\n          \"url\": \"https://www.patreon.com/feross\"\n        },\n        {\n          \"type\": \"consulting\",\n          \"url\": \"https://feross.org/support\"\n        }\n      ],\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"base64-js\": \"^1.3.1\",\n        \"ieee754\": \"^1.2.1\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/readdir-glob\": {\n      \"version\": \"1.1.3\",\n      \"resolved\": \"https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz\",\n      \"integrity\": \"sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"minimatch\": \"^5.1.0\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/readdir-glob/node_modules/brace-expansion\": {\n      \"version\": \"2.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz\",\n      \"integrity\": \"sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"balanced-match\": \"^1.0.0\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/readdir-glob/node_modules/minimatch\": {\n      \"version\": \"5.1.9\",\n      \"resolved\": \"https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz\",\n      \"integrity\": \"sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==\",\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"brace-expansion\": \"^2.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/resolve-from\": {\n      \"version\": \"5.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz\",\n      \"integrity\": \"sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/router\": {\n      \"version\": \"2.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/router/-/router-2.2.0.tgz\",\n      \"integrity\": \"sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"debug\": \"^4.4.0\",\n        \"depd\": \"^2.0.0\",\n        \"is-promise\": \"^4.0.0\",\n        \"parseurl\": \"^1.3.3\",\n        \"path-to-regexp\": \"^8.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 18\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/safe-buffer\": {\n      \"version\": \"5.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz\",\n      \"integrity\": \"sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/safer-buffer\": {\n      \"version\": \"2.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz\",\n      \"integrity\": \"sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/sanitize-filename\": {\n      \"version\": \"1.6.4\",\n      \"resolved\": \"https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.4.tgz\",\n      \"integrity\": \"sha512-9ZyI08PsvdQl2r/bBIGubpVdR3RR9sY6RDiWFPreA21C/EFlQhmgo20UZlNjZMMZNubusLhAQozkA0Od5J21Eg==\",\n      \"license\": \"WTFPL OR ISC\",\n      \"dependencies\": {\n        \"truncate-utf8-bytes\": \"^1.0.0\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/select-hose\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz\",\n      \"integrity\": \"sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==\",\n      \"license\": \"MIT\",\n      \"optional\": true\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/semver\": {\n      \"version\": \"7.7.4\",\n      \"resolved\": \"https://registry.npmjs.org/semver/-/semver-7.7.4.tgz\",\n      \"integrity\": \"sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==\",\n      \"license\": \"ISC\",\n      \"bin\": {\n        \"semver\": \"bin/semver.js\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/send\": {\n      \"version\": \"1.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/send/-/send-1.2.1.tgz\",\n      \"integrity\": \"sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"debug\": \"^4.4.3\",\n        \"encodeurl\": \"^2.0.0\",\n        \"escape-html\": \"^1.0.3\",\n        \"etag\": \"^1.8.1\",\n        \"fresh\": \"^2.0.0\",\n        \"http-errors\": \"^2.0.1\",\n        \"mime-types\": \"^3.0.2\",\n        \"ms\": \"^2.1.3\",\n        \"on-finished\": \"^2.4.1\",\n        \"range-parser\": \"^1.2.1\",\n        \"statuses\": \"^2.0.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 18\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/express\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/serve-favicon\": {\n      \"version\": \"2.5.1\",\n      \"resolved\": \"https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.5.1.tgz\",\n      \"integrity\": \"sha512-JndLBslCLA/ebr7rS3d+/EKkzTsTi1jI2T9l+vHfAaGJ7A7NhtDpSZ0lx81HCNWnnE0yHncG+SSnVf9IMxOwXQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"etag\": \"~1.8.1\",\n        \"fresh\": \"~0.5.2\",\n        \"ms\": \"~2.1.3\",\n        \"parseurl\": \"~1.3.2\",\n        \"safe-buffer\": \"~5.2.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.8.0\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/serve-favicon/node_modules/fresh\": {\n      \"version\": \"0.5.2\",\n      \"resolved\": \"https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz\",\n      \"integrity\": \"sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.6\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/serve-favicon/node_modules/safe-buffer\": {\n      \"version\": \"5.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz\",\n      \"integrity\": \"sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==\",\n      \"funding\": [\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/feross\"\n        },\n        {\n          \"type\": \"patreon\",\n          \"url\": \"https://www.patreon.com/feross\"\n        },\n        {\n          \"type\": \"consulting\",\n          \"url\": \"https://feross.org/support\"\n        }\n      ],\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/serve-static\": {\n      \"version\": \"2.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz\",\n      \"integrity\": \"sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"encodeurl\": \"^2.0.0\",\n        \"escape-html\": \"^1.0.3\",\n        \"parseurl\": \"^1.3.3\",\n        \"send\": \"^1.2.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 18\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/express\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/set-blocking\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz\",\n      \"integrity\": \"sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==\",\n      \"license\": \"ISC\"\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/setprototypeof\": {\n      \"version\": \"1.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz\",\n      \"integrity\": \"sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==\",\n      \"license\": \"ISC\"\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/sharp\": {\n      \"version\": \"0.34.5\",\n      \"resolved\": \"https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz\",\n      \"integrity\": \"sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==\",\n      \"hasInstallScript\": true,\n      \"license\": \"Apache-2.0\",\n      \"optional\": true,\n      \"dependencies\": {\n        \"@img/colour\": \"^1.0.0\",\n        \"detect-libc\": \"^2.1.2\",\n        \"semver\": \"^7.7.3\"\n      },\n      \"engines\": {\n        \"node\": \"^18.17.0 || ^20.3.0 || >=21.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://opencollective.com/libvips\"\n      },\n      \"optionalDependencies\": {\n        \"@img/sharp-darwin-arm64\": \"0.34.5\",\n        \"@img/sharp-darwin-x64\": \"0.34.5\",\n        \"@img/sharp-libvips-darwin-arm64\": \"1.2.4\",\n        \"@img/sharp-libvips-darwin-x64\": \"1.2.4\",\n        \"@img/sharp-libvips-linux-arm\": \"1.2.4\",\n        \"@img/sharp-libvips-linux-arm64\": \"1.2.4\",\n        \"@img/sharp-libvips-linux-ppc64\": \"1.2.4\",\n        \"@img/sharp-libvips-linux-riscv64\": \"1.2.4\",\n        \"@img/sharp-libvips-linux-s390x\": \"1.2.4\",\n        \"@img/sharp-libvips-linux-x64\": \"1.2.4\",\n        \"@img/sharp-libvips-linuxmusl-arm64\": \"1.2.4\",\n        \"@img/sharp-libvips-linuxmusl-x64\": \"1.2.4\",\n        \"@img/sharp-linux-arm\": \"0.34.5\",\n        \"@img/sharp-linux-arm64\": \"0.34.5\",\n        \"@img/sharp-linux-ppc64\": \"0.34.5\",\n        \"@img/sharp-linux-riscv64\": \"0.34.5\",\n        \"@img/sharp-linux-s390x\": \"0.34.5\",\n        \"@img/sharp-linux-x64\": \"0.34.5\",\n        \"@img/sharp-linuxmusl-arm64\": \"0.34.5\",\n        \"@img/sharp-linuxmusl-x64\": \"0.34.5\",\n        \"@img/sharp-wasm32\": \"0.34.5\",\n        \"@img/sharp-win32-arm64\": \"0.34.5\",\n        \"@img/sharp-win32-ia32\": \"0.34.5\",\n        \"@img/sharp-win32-x64\": \"0.34.5\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/shebang-command\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz\",\n      \"integrity\": \"sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"shebang-regex\": \"^3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/shebang-regex\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz\",\n      \"integrity\": \"sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/shell-quote\": {\n      \"version\": \"1.8.3\",\n      \"resolved\": \"https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz\",\n      \"integrity\": \"sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/side-channel\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz\",\n      \"integrity\": \"sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"es-errors\": \"^1.3.0\",\n        \"object-inspect\": \"^1.13.3\",\n        \"side-channel-list\": \"^1.0.0\",\n        \"side-channel-map\": \"^1.0.1\",\n        \"side-channel-weakmap\": \"^1.0.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/side-channel-list\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz\",\n      \"integrity\": \"sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"es-errors\": \"^1.3.0\",\n        \"object-inspect\": \"^1.13.4\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/side-channel-map\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz\",\n      \"integrity\": \"sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"call-bound\": \"^1.0.2\",\n        \"es-errors\": \"^1.3.0\",\n        \"get-intrinsic\": \"^1.2.5\",\n        \"object-inspect\": \"^1.13.3\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/side-channel-weakmap\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz\",\n      \"integrity\": \"sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"call-bound\": \"^1.0.2\",\n        \"es-errors\": \"^1.3.0\",\n        \"get-intrinsic\": \"^1.2.5\",\n        \"object-inspect\": \"^1.13.3\",\n        \"side-channel-map\": \"^1.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/signal-exit\": {\n      \"version\": \"3.0.7\",\n      \"resolved\": \"https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz\",\n      \"integrity\": \"sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==\",\n      \"license\": \"ISC\"\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/spdx-correct\": {\n      \"version\": \"3.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz\",\n      \"integrity\": \"sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"spdx-expression-parse\": \"^3.0.0\",\n        \"spdx-license-ids\": \"^3.0.0\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/spdx-exceptions\": {\n      \"version\": \"2.5.0\",\n      \"resolved\": \"https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz\",\n      \"integrity\": \"sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==\",\n      \"license\": \"CC-BY-3.0\"\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/spdx-expression-parse\": {\n      \"version\": \"3.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz\",\n      \"integrity\": \"sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"spdx-exceptions\": \"^2.1.0\",\n        \"spdx-license-ids\": \"^3.0.0\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/spdx-license-ids\": {\n      \"version\": \"3.0.23\",\n      \"resolved\": \"https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz\",\n      \"integrity\": \"sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==\",\n      \"license\": \"CC0-1.0\"\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/spdy\": {\n      \"version\": \"4.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz\",\n      \"integrity\": \"sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==\",\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"dependencies\": {\n        \"debug\": \"^4.1.0\",\n        \"handle-thing\": \"^2.0.0\",\n        \"http-deceiver\": \"^1.2.7\",\n        \"select-hose\": \"^2.0.0\",\n        \"spdy-transport\": \"^3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6.0.0\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/spdy-transport\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz\",\n      \"integrity\": \"sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==\",\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"dependencies\": {\n        \"debug\": \"^4.1.0\",\n        \"detect-node\": \"^2.0.4\",\n        \"hpack.js\": \"^2.1.6\",\n        \"obuf\": \"^1.1.2\",\n        \"readable-stream\": \"^3.0.6\",\n        \"wbuf\": \"^1.7.3\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/spdy-transport/node_modules/readable-stream\": {\n      \"version\": \"3.6.2\",\n      \"resolved\": \"https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz\",\n      \"integrity\": \"sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==\",\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"dependencies\": {\n        \"inherits\": \"^2.0.3\",\n        \"string_decoder\": \"^1.1.1\",\n        \"util-deprecate\": \"^1.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 6\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/statuses\": {\n      \"version\": \"2.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz\",\n      \"integrity\": \"sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/stream-buffers\": {\n      \"version\": \"2.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz\",\n      \"integrity\": \"sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==\",\n      \"license\": \"Unlicense\",\n      \"engines\": {\n        \"node\": \">= 0.10.0\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/stream-combiner\": {\n      \"version\": \"0.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz\",\n      \"integrity\": \"sha512-6yHMqgLYDzQDcAkL+tjJDC5nSNuNIx0vZtRZeiPh7Saef7VHX9H5Ijn9l2VIol2zaNYlYEX6KyuT/237A58qEQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"duplexer\": \"~0.1.1\",\n        \"through\": \"~2.3.4\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/streamx\": {\n      \"version\": \"2.25.0\",\n      \"resolved\": \"https://registry.npmjs.org/streamx/-/streamx-2.25.0.tgz\",\n      \"integrity\": \"sha512-0nQuG6jf1w+wddNEEXCF4nTg3LtufWINB5eFEN+5TNZW7KWJp6x87+JFL43vaAUPyCfH1wID+mNVyW6OHtFamg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"events-universal\": \"^1.0.0\",\n        \"fast-fifo\": \"^1.3.2\",\n        \"text-decoder\": \"^1.1.0\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/string_decoder\": {\n      \"version\": \"1.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz\",\n      \"integrity\": \"sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"safe-buffer\": \"~5.2.0\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/string_decoder/node_modules/safe-buffer\": {\n      \"version\": \"5.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz\",\n      \"integrity\": \"sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==\",\n      \"funding\": [\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/feross\"\n        },\n        {\n          \"type\": \"patreon\",\n          \"url\": \"https://www.patreon.com/feross\"\n        },\n        {\n          \"type\": \"consulting\",\n          \"url\": \"https://feross.org/support\"\n        }\n      ],\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/string-width\": {\n      \"version\": \"4.2.3\",\n      \"resolved\": \"https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz\",\n      \"integrity\": \"sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"emoji-regex\": \"^8.0.0\",\n        \"is-fullwidth-code-point\": \"^3.0.0\",\n        \"strip-ansi\": \"^6.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/string-width-cjs\": {\n      \"name\": \"string-width\",\n      \"version\": \"4.2.3\",\n      \"resolved\": \"https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz\",\n      \"integrity\": \"sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"emoji-regex\": \"^8.0.0\",\n        \"is-fullwidth-code-point\": \"^3.0.0\",\n        \"strip-ansi\": \"^6.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/strip-ansi\": {\n      \"version\": \"6.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz\",\n      \"integrity\": \"sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"ansi-regex\": \"^5.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/strip-ansi-cjs\": {\n      \"name\": \"strip-ansi\",\n      \"version\": \"6.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz\",\n      \"integrity\": \"sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"ansi-regex\": \"^5.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/strip-ansi-cjs/node_modules/ansi-regex\": {\n      \"version\": \"5.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz\",\n      \"integrity\": \"sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/strip-ansi/node_modules/ansi-regex\": {\n      \"version\": \"5.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz\",\n      \"integrity\": \"sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/supports-color\": {\n      \"version\": \"10.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/supports-color/-/supports-color-10.2.2.tgz\",\n      \"integrity\": \"sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/supports-color?sponsor=1\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/tagged-tag\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz\",\n      \"integrity\": \"sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=20\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/tar-stream\": {\n      \"version\": \"3.1.8\",\n      \"resolved\": \"https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.8.tgz\",\n      \"integrity\": \"sha512-U6QpVRyCGHva435KoNWy9PRoi2IFYCgtEhq9nmrPPpbRacPs9IH4aJ3gbrFC8dPcXvdSZ4XXfXT5Fshbp2MtlQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"b4a\": \"^1.6.4\",\n        \"bare-fs\": \"^4.5.5\",\n        \"fast-fifo\": \"^1.2.0\",\n        \"streamx\": \"^2.15.0\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/teen_process\": {\n      \"version\": \"4.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/teen_process/-/teen_process-4.1.0.tgz\",\n      \"integrity\": \"sha512-AN8y3MYPExB3r2mkkX9r0wEF4xPfhKOj6YvcfeIqQai+GVhTIhjjdkPvwI5CFT4z8UQ5aZWldzbJ+jNejYAdGw==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"lodash\": \"^4.17.21\",\n        \"shell-quote\": \"^1.8.1\"\n      },\n      \"engines\": {\n        \"node\": \"^20.19.0 || ^22.12.0 || >=24.0.0\",\n        \"npm\": \">=10\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/teex\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/teex/-/teex-1.0.1.tgz\",\n      \"integrity\": \"sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"streamx\": \"^2.12.5\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/text-decoder\": {\n      \"version\": \"1.2.7\",\n      \"resolved\": \"https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.7.tgz\",\n      \"integrity\": \"sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"b4a\": \"^1.6.4\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/through\": {\n      \"version\": \"2.3.8\",\n      \"resolved\": \"https://registry.npmjs.org/through/-/through-2.3.8.tgz\",\n      \"integrity\": \"sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/toidentifier\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz\",\n      \"integrity\": \"sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=0.6\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/truncate-utf8-bytes\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz\",\n      \"integrity\": \"sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==\",\n      \"license\": \"WTFPL\",\n      \"dependencies\": {\n        \"utf8-byte-length\": \"^1.0.1\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/type-fest\": {\n      \"version\": \"5.5.0\",\n      \"resolved\": \"https://registry.npmjs.org/type-fest/-/type-fest-5.5.0.tgz\",\n      \"integrity\": \"sha512-PlBfpQwiUvGViBNX84Yxwjsdhd1TUlXr6zjX7eoirtCPIr08NAmxwa+fcYBTeRQxHo9YC9wwF3m9i700sHma8g==\",\n      \"license\": \"(MIT OR CC0-1.0)\",\n      \"dependencies\": {\n        \"tagged-tag\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=20\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/type-is\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz\",\n      \"integrity\": \"sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"content-type\": \"^1.0.5\",\n        \"media-typer\": \"^1.1.0\",\n        \"mime-types\": \"^3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.6\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/unicorn-magic\": {\n      \"version\": \"0.4.0\",\n      \"resolved\": \"https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.4.0.tgz\",\n      \"integrity\": \"sha512-wH590V9VNgYH9g3lH9wWjTrUoKsjLF6sGLjhR4sH1LWpLmCOH0Zf7PukhDA8BiS7KHe4oPNkcTHqYkj7SOGUOw==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=20\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/unorm\": {\n      \"version\": \"1.6.0\",\n      \"resolved\": \"https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz\",\n      \"integrity\": \"sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==\",\n      \"license\": \"MIT or GPL-2.0\",\n      \"engines\": {\n        \"node\": \">= 0.4.0\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/unpipe\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz\",\n      \"integrity\": \"sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/utf8-byte-length\": {\n      \"version\": \"1.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz\",\n      \"integrity\": \"sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==\",\n      \"license\": \"(WTFPL OR MIT)\"\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/util-deprecate\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz\",\n      \"integrity\": \"sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/uuid\": {\n      \"version\": \"13.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/uuid/-/uuid-13.0.0.tgz\",\n      \"integrity\": \"sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==\",\n      \"funding\": [\n        \"https://github.com/sponsors/broofa\",\n        \"https://github.com/sponsors/ctavan\"\n      ],\n      \"license\": \"MIT\",\n      \"bin\": {\n        \"uuid\": \"dist-node/bin/uuid\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/validate-npm-package-license\": {\n      \"version\": \"3.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz\",\n      \"integrity\": \"sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"spdx-correct\": \"^3.0.0\",\n        \"spdx-expression-parse\": \"^3.0.0\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/vary\": {\n      \"version\": \"1.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/vary/-/vary-1.1.2.tgz\",\n      \"integrity\": \"sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/wbuf\": {\n      \"version\": \"1.7.3\",\n      \"resolved\": \"https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz\",\n      \"integrity\": \"sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==\",\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"dependencies\": {\n        \"minimalistic-assert\": \"^1.0.0\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/which\": {\n      \"version\": \"6.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/which/-/which-6.0.1.tgz\",\n      \"integrity\": \"sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==\",\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"isexe\": \"^4.0.0\"\n      },\n      \"bin\": {\n        \"node-which\": \"bin/which.js\"\n      },\n      \"engines\": {\n        \"node\": \"^20.17.0 || >=22.9.0\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/wrap-ansi-cjs\": {\n      \"name\": \"wrap-ansi\",\n      \"version\": \"7.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz\",\n      \"integrity\": \"sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"ansi-styles\": \"^4.0.0\",\n        \"string-width\": \"^4.1.0\",\n        \"strip-ansi\": \"^6.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/wrap-ansi?sponsor=1\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/wrappy\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz\",\n      \"integrity\": \"sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==\",\n      \"license\": \"ISC\"\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/ws\": {\n      \"version\": \"8.20.0\",\n      \"resolved\": \"https://registry.npmjs.org/ws/-/ws-8.20.0.tgz\",\n      \"integrity\": \"sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=10.0.0\"\n      },\n      \"peerDependencies\": {\n        \"bufferutil\": \"^4.0.1\",\n        \"utf-8-validate\": \">=5.0.2\"\n      },\n      \"peerDependenciesMeta\": {\n        \"bufferutil\": {\n          \"optional\": true\n        },\n        \"utf-8-validate\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/xmlbuilder\": {\n      \"version\": \"15.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz\",\n      \"integrity\": \"sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=8.0\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/xpath\": {\n      \"version\": \"0.0.34\",\n      \"resolved\": \"https://registry.npmjs.org/xpath/-/xpath-0.0.34.tgz\",\n      \"integrity\": \"sha512-FxF6+rkr1rNSQrhUNYrAFJpRXNzlDoMxeXN5qI84939ylEv3qqPFKa85Oxr6tDaJKqwW6KKyo2v26TSv3k6LeA==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=0.6.0\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/yauzl\": {\n      \"version\": \"3.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/yauzl/-/yauzl-3.3.0.tgz\",\n      \"integrity\": \"sha512-PtGEvEP30p7sbIBJKUBjUnqgTVOyMURc4dLo9iNyAJnNIEz9pm88cCXF21w94Kg3k6RXkeZh5DHOGS0qEONvNQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"buffer-crc32\": \"~0.2.3\",\n        \"pend\": \"~1.2.0\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/yauzl/node_modules/buffer-crc32\": {\n      \"version\": \"0.2.13\",\n      \"resolved\": \"https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz\",\n      \"integrity\": \"sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \"*\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/yocto-queue\": {\n      \"version\": \"1.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz\",\n      \"integrity\": \"sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=12.20\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/yoctocolors\": {\n      \"version\": \"2.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.2.tgz\",\n      \"integrity\": \"sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/appium-uiautomator2-driver/node_modules/zip-stream\": {\n      \"version\": \"6.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/zip-stream/-/zip-stream-6.0.1.tgz\",\n      \"integrity\": \"sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"archiver-utils\": \"^5.0.0\",\n        \"compress-commons\": \"^6.0.2\",\n        \"readable-stream\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 14\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver\": {\n      \"version\": \"10.43.1\",\n      \"resolved\": \"https://registry.npmjs.org/appium-xcuitest-driver/-/appium-xcuitest-driver-10.43.1.tgz\",\n      \"integrity\": \"sha512-MCUSesaNaa2rXP9xLbQmMFV9XmZH2LUK5TO/fD9kiSqQJzT31lxtN+U0elpUgfnu6ZIGkug+MB+x84RQud7Ahg==\",\n      \"hasShrinkwrap\": true,\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"@appium/strongbox\": \"^1.0.0-rc.1\",\n        \"@colors/colors\": \"^1.6.0\",\n        \"appium-idb\": \"^2.0.0\",\n        \"appium-ios-device\": \"^3.0.0\",\n        \"appium-ios-simulator\": \"^8.0.0\",\n        \"appium-remote-debugger\": \"^15.6.0\",\n        \"appium-webdriveragent\": \"^11.4.0\",\n        \"appium-xcode\": \"^6.0.2\",\n        \"async-lock\": \"^1.4.0\",\n        \"asyncbox\": \"^6.0.1\",\n        \"axios\": \"^1.4.0\",\n        \"bluebird\": \"^3.7.2\",\n        \"commander\": \"^14.0.1\",\n        \"css-selector-parser\": \"^3.0.0\",\n        \"js2xmlparser2\": \"^0.x\",\n        \"lodash\": \"^4.17.21\",\n        \"lru-cache\": \"^11.1.0\",\n        \"moment\": \"^2.29.4\",\n        \"moment-timezone\": \"^0.x\",\n        \"node-devicectl\": \"^1.1.0\",\n        \"node-simctl\": \"^8.1.1\",\n        \"portscanner\": \"^2.2.0\",\n        \"semver\": \"^7.5.4\",\n        \"teen_process\": \"^4.0.4\",\n        \"winston\": \"^3.17.0\",\n        \"ws\": \"^8.13.0\"\n      },\n      \"engines\": {\n        \"node\": \"^20.19.0 || ^22.12.0 || >=24.0.0\",\n        \"npm\": \">=10\"\n      },\n      \"optionalDependencies\": {\n        \"appium-ios-remotexpc\": \"^0.x\"\n      },\n      \"peerDependencies\": {\n        \"appium\": \"^3.0.0-rc.2\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/@appium/base-driver\": {\n      \"version\": \"10.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/@appium/base-driver/-/base-driver-10.3.0.tgz\",\n      \"integrity\": \"sha512-9r+1f9EtcJt9NXIlyHdFMoD7DsAZPzpRq4Kj1hGZf7+26q1SFEyyMAuWxvlWGY7EoyPtPRyMUkM4dHiSK3Q9+w==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"@appium/support\": \"7.1.0\",\n        \"@appium/types\": \"1.3.0\",\n        \"@colors/colors\": \"1.6.0\",\n        \"async-lock\": \"1.4.1\",\n        \"asyncbox\": \"6.1.0\",\n        \"axios\": \"1.15.0\",\n        \"bluebird\": \"3.7.2\",\n        \"body-parser\": \"2.2.2\",\n        \"express\": \"5.2.1\",\n        \"fastest-levenshtein\": \"1.0.16\",\n        \"http-status-codes\": \"2.3.0\",\n        \"lodash\": \"4.18.1\",\n        \"lru-cache\": \"11.3.3\",\n        \"method-override\": \"3.0.0\",\n        \"morgan\": \"1.10.1\",\n        \"path-to-regexp\": \"8.4.2\",\n        \"serve-favicon\": \"2.5.1\",\n        \"type-fest\": \"5.5.0\"\n      },\n      \"engines\": {\n        \"node\": \"^20.19.0 || ^22.12.0 || >=24.0.0\",\n        \"npm\": \">=10\"\n      },\n      \"optionalDependencies\": {\n        \"spdy\": \"4.0.2\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/@appium/logger\": {\n      \"version\": \"2.0.6\",\n      \"resolved\": \"https://registry.npmjs.org/@appium/logger/-/logger-2.0.6.tgz\",\n      \"integrity\": \"sha512-9e8n9CtINBwi1ASEU5OyswmR2F7OnbrGfmf9yTy9i+rx4GR9RJlEp0/arsxvuyWCep67tOmM4FiRyXxxHjOK5Q==\",\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"console-control-strings\": \"1.1.0\",\n        \"lodash\": \"4.18.1\",\n        \"lru-cache\": \"11.3.3\",\n        \"set-blocking\": \"2.0.0\"\n      },\n      \"engines\": {\n        \"node\": \"^20.19.0 || ^22.12.0 || >=24.0.0\",\n        \"npm\": \">=10\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/@appium/schema\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/@appium/schema/-/schema-1.1.0.tgz\",\n      \"integrity\": \"sha512-m0vTLU7mhC9RR294Nz84g+FhEQ0iZKq6p3rfz1+qfEqCXRXUvDbllSOu2tCVpBKMIoEFZAmkwjuwXobJpCnilQ==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"json-schema\": \"0.4.0\"\n      },\n      \"engines\": {\n        \"node\": \"^20.19.0 || ^22.12.0 || >=24.0.0\",\n        \"npm\": \">=10\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/@appium/strongbox\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/@appium/strongbox/-/strongbox-1.1.0.tgz\",\n      \"integrity\": \"sha512-X+Ff/6sGiTXHx2W3s+Gg3XyZMbIZe5v3jFSrwUJ9kH7NuGzpzrzEoKx9EMOw7iXVLMV6/NmuDQPq80gzOcRwjA==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"env-paths\": \"4.0.0\",\n        \"slugify\": \"1.6.9\"\n      },\n      \"engines\": {\n        \"node\": \"^20.19.0 || ^22.12.0 || >=24.0.0\",\n        \"npm\": \">=10\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/@appium/support\": {\n      \"version\": \"7.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/@appium/support/-/support-7.1.0.tgz\",\n      \"integrity\": \"sha512-kY4Qv4TzLCYmZnN2eNptEa8RiRzpbimIQ6tKuDaqLC2Y3q5Al4NumL/xRQAvfXJq/hNezq2Jh8NwciEW8zX/0g==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"@appium/logger\": \"2.0.6\",\n        \"@appium/tsconfig\": \"1.1.2\",\n        \"@appium/types\": \"1.3.0\",\n        \"@colors/colors\": \"1.6.0\",\n        \"archiver\": \"7.0.1\",\n        \"asyncbox\": \"6.1.0\",\n        \"axios\": \"1.15.0\",\n        \"base64-stream\": \"1.0.0\",\n        \"bluebird\": \"3.7.2\",\n        \"bplist-creator\": \"0.1.1\",\n        \"bplist-parser\": \"0.3.2\",\n        \"form-data\": \"4.0.5\",\n        \"get-stream\": \"9.0.1\",\n        \"glob\": \"13.0.6\",\n        \"jsftp\": \"2.1.3\",\n        \"klaw\": \"4.1.0\",\n        \"lockfile\": \"1.0.4\",\n        \"lodash\": \"4.18.1\",\n        \"log-symbols\": \"7.0.1\",\n        \"ncp\": \"2.0.0\",\n        \"package-directory\": \"8.2.0\",\n        \"plist\": \"3.1.0\",\n        \"pluralize\": \"8.0.0\",\n        \"read-pkg\": \"10.1.0\",\n        \"resolve-from\": \"5.0.0\",\n        \"sanitize-filename\": \"1.6.4\",\n        \"semver\": \"7.7.4\",\n        \"shell-quote\": \"1.8.3\",\n        \"supports-color\": \"10.2.2\",\n        \"teen_process\": \"4.1.0\",\n        \"type-fest\": \"5.5.0\",\n        \"uuid\": \"13.0.0\",\n        \"which\": \"6.0.1\",\n        \"yauzl\": \"3.3.0\"\n      },\n      \"engines\": {\n        \"node\": \"^20.19.0 || ^22.12.0 || >=24.0.0\",\n        \"npm\": \">=10\"\n      },\n      \"optionalDependencies\": {\n        \"sharp\": \"0.34.5\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/@appium/tsconfig\": {\n      \"version\": \"1.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/@appium/tsconfig/-/tsconfig-1.1.2.tgz\",\n      \"integrity\": \"sha512-lHKBm7hXCROc1Ha/cBxS4o3iQkeY96Pz7qM9Uh9vFDkdpTGBk56V1lmc3iGcgBYKBlaRT/LZmTsqClvHoiXhvw==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"@tsconfig/node20\": \"20.1.9\"\n      },\n      \"engines\": {\n        \"node\": \"^20.19.0 || ^22.12.0 || >=24.0.0\",\n        \"npm\": \">=10\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/@appium/types\": {\n      \"version\": \"1.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/@appium/types/-/types-1.3.0.tgz\",\n      \"integrity\": \"sha512-Gv4ev/5K5N7TvAHqem2DmB50zipC951QlmCDpuxDNHQl2dtCr20vJgnN8if7upqLcBX/6yNp3udR+f1n99zgcQ==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"@appium/logger\": \"2.0.6\",\n        \"@appium/schema\": \"1.1.0\",\n        \"@appium/tsconfig\": \"1.1.2\",\n        \"type-fest\": \"5.5.0\"\n      },\n      \"engines\": {\n        \"node\": \"^20.19.0 || ^22.12.0 || >=24.0.0\",\n        \"npm\": \">=10\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/@babel/code-frame\": {\n      \"version\": \"7.29.0\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz\",\n      \"integrity\": \"sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@babel/helper-validator-identifier\": \"^7.28.5\",\n        \"js-tokens\": \"^4.0.0\",\n        \"picocolors\": \"^1.1.1\"\n      },\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/@babel/helper-validator-identifier\": {\n      \"version\": \"7.28.5\",\n      \"resolved\": \"https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz\",\n      \"integrity\": \"sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=6.9.0\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/@colors/colors\": {\n      \"version\": \"1.6.0\",\n      \"resolved\": \"https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz\",\n      \"integrity\": \"sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=0.1.90\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/@dabh/diagnostics\": {\n      \"version\": \"2.0.8\",\n      \"resolved\": \"https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.8.tgz\",\n      \"integrity\": \"sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@so-ric/colorspace\": \"^1.1.6\",\n        \"enabled\": \"2.0.x\",\n        \"kuler\": \"^2.0.0\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/@img/colour\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz\",\n      \"integrity\": \"sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==\",\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/@isaacs/cliui\": {\n      \"version\": \"8.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz\",\n      \"integrity\": \"sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==\",\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"string-width\": \"^5.1.2\",\n        \"string-width-cjs\": \"npm:string-width@^4.2.0\",\n        \"strip-ansi\": \"^7.0.1\",\n        \"strip-ansi-cjs\": \"npm:strip-ansi@^6.0.1\",\n        \"wrap-ansi\": \"^8.1.0\",\n        \"wrap-ansi-cjs\": \"npm:wrap-ansi@^7.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/@isaacs/cliui/node_modules/ansi-styles\": {\n      \"version\": \"6.2.3\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz\",\n      \"integrity\": \"sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/ansi-styles?sponsor=1\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/@isaacs/cliui/node_modules/emoji-regex\": {\n      \"version\": \"9.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz\",\n      \"integrity\": \"sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/@isaacs/cliui/node_modules/string-width\": {\n      \"version\": \"5.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz\",\n      \"integrity\": \"sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"eastasianwidth\": \"^0.2.0\",\n        \"emoji-regex\": \"^9.2.2\",\n        \"strip-ansi\": \"^7.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/@isaacs/cliui/node_modules/strip-ansi\": {\n      \"version\": \"7.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz\",\n      \"integrity\": \"sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"ansi-regex\": \"^6.2.2\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/strip-ansi?sponsor=1\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/@isaacs/cliui/node_modules/wrap-ansi\": {\n      \"version\": \"8.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz\",\n      \"integrity\": \"sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"ansi-styles\": \"^6.1.0\",\n        \"string-width\": \"^5.0.1\",\n        \"strip-ansi\": \"^7.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/wrap-ansi?sponsor=1\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/@pkgjs/parseargs\": {\n      \"version\": \"0.11.0\",\n      \"resolved\": \"https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz\",\n      \"integrity\": \"sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==\",\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"engines\": {\n        \"node\": \">=14\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/@sec-ant/readable-stream\": {\n      \"version\": \"0.4.1\",\n      \"resolved\": \"https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz\",\n      \"integrity\": \"sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/@so-ric/colorspace\": {\n      \"version\": \"1.1.6\",\n      \"resolved\": \"https://registry.npmjs.org/@so-ric/colorspace/-/colorspace-1.1.6.tgz\",\n      \"integrity\": \"sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"color\": \"^5.0.2\",\n        \"text-hex\": \"1.0.x\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/@tsconfig/node20\": {\n      \"version\": \"20.1.9\",\n      \"resolved\": \"https://registry.npmjs.org/@tsconfig/node20/-/node20-20.1.9.tgz\",\n      \"integrity\": \"sha512-IjlTv1RsvnPtUcjTqtVsZExKVq+KQx4g5pCP5tI7rAs6Xesl2qFwSz/tPDBC4JajkL/MlezBu3gPUwqRHl+RIg==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/@types/node\": {\n      \"version\": \"25.6.0\",\n      \"resolved\": \"https://registry.npmjs.org/@types/node/-/node-25.6.0.tgz\",\n      \"integrity\": \"sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ==\",\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"dependencies\": {\n        \"undici-types\": \"~7.19.0\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/@types/normalize-package-data\": {\n      \"version\": \"2.4.4\",\n      \"resolved\": \"https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz\",\n      \"integrity\": \"sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/@types/triple-beam\": {\n      \"version\": \"1.3.5\",\n      \"resolved\": \"https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz\",\n      \"integrity\": \"sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/@xmldom/xmldom\": {\n      \"version\": \"0.9.9\",\n      \"resolved\": \"https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.9.9.tgz\",\n      \"integrity\": \"sha512-qycIHAucxy/LXAYIjmLmtQ8q9GPnMbnjG1KXhWm9o5sCr6pOYDATkMPiTNa6/v8eELyqOQ2FsEqeoFYmgv/gJg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=14.6\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/abort-controller\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz\",\n      \"integrity\": \"sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"event-target-shim\": \"^5.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6.5\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/accepts\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz\",\n      \"integrity\": \"sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"mime-types\": \"^3.0.0\",\n        \"negotiator\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.6\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/ansi-regex\": {\n      \"version\": \"6.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz\",\n      \"integrity\": \"sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/ansi-regex?sponsor=1\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/ansi-styles\": {\n      \"version\": \"4.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz\",\n      \"integrity\": \"sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"color-convert\": \"^2.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/ansi-styles?sponsor=1\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/appium-idb\": {\n      \"version\": \"2.0.10\",\n      \"resolved\": \"https://registry.npmjs.org/appium-idb/-/appium-idb-2.0.10.tgz\",\n      \"integrity\": \"sha512-k25bH3dWbir75iU51e4qMwN6UURcX/KY7zz7e8mZ5ESOVdwfeX4Tp7XxbvnIweHFPsbGPPBf7EmazBYC5a+/FQ==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"@appium/support\": \"^7.0.0-rc.1\",\n        \"asyncbox\": \"^6.1.0\",\n        \"bluebird\": \"^3.1.1\",\n        \"lodash\": \"^4.0.0\",\n        \"teen_process\": \"^4.0.4\"\n      },\n      \"engines\": {\n        \"node\": \"^20.19.0 || ^22.12.0 || >=24.0.0\",\n        \"npm\": \">=10\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/appium-ios-device\": {\n      \"version\": \"3.1.10\",\n      \"resolved\": \"https://registry.npmjs.org/appium-ios-device/-/appium-ios-device-3.1.10.tgz\",\n      \"integrity\": \"sha512-2oE7yQtLSdrcZ9YArqgGguzDuiplHj0GXSMlTfwTXl0n22DEzkV0M1mXdaNaWNuzVBJ5VDc1EuYv38p1ruuk2g==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"@appium/support\": \"^7.0.0-rc.1\",\n        \"asyncbox\": \"^6.0.1\",\n        \"axios\": \"^1.6.7\",\n        \"bluebird\": \"^3.1.1\",\n        \"bplist-creator\": \"^0.x\",\n        \"bplist-parser\": \"^0.x\",\n        \"lodash\": \"^4.17.15\",\n        \"semver\": \"^7.0.0\"\n      },\n      \"engines\": {\n        \"node\": \"^20.19.0 || ^22.12.0 || >=24.0.0\",\n        \"npm\": \">=10\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/appium-ios-remotexpc\": {\n      \"version\": \"0.44.0\",\n      \"resolved\": \"https://registry.npmjs.org/appium-ios-remotexpc/-/appium-ios-remotexpc-0.44.0.tgz\",\n      \"integrity\": \"sha512-e7DbfRJuobWpsOHTpdtzWPlb2R3HvLEjzist9D5Lzk5bzpEDasYiV+hlr+mvq6VM7gjB7ZHN8lZ3CC5kF3HQAw==\",\n      \"license\": \"Apache-2.0\",\n      \"optional\": true,\n      \"dependencies\": {\n        \"@appium/strongbox\": \"^1.0.0-rc.1\",\n        \"@appium/support\": \"^7.0.0-rc.1\",\n        \"@types/node\": \"^25.0.2\",\n        \"@xmldom/xmldom\": \"^0.9.8\",\n        \"appium-ios-tuntap\": \"^0.x\",\n        \"axios\": \"^1.12.0\",\n        \"commander\": \"^14.0.1\",\n        \"dnssd\": \"^0.x\",\n        \"minimatch\": \"^10.1.1\",\n        \"node-devicectl\": \"^1.2.0\",\n        \"npm-run-all2\": \"^8.0.4\",\n        \"path-to-regexp\": \"^8.3.0\"\n      },\n      \"engines\": {\n        \"node\": \"^20.19.0 || ^22.12.0 || >=24.0.0\",\n        \"npm\": \">=10\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/appium-ios-simulator\": {\n      \"version\": \"8.0.12\",\n      \"resolved\": \"https://registry.npmjs.org/appium-ios-simulator/-/appium-ios-simulator-8.0.12.tgz\",\n      \"integrity\": \"sha512-ZIq9k0PJTq7MtttQmu8pBkQE7i1TNw/itqklAkwmstld8vTAn2RXv3+hAwFo1aZt01gdSPjky5EFgizNu72//Q==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"@appium/support\": \"^7.0.0-rc.1\",\n        \"@xmldom/xmldom\": \"^0.x\",\n        \"appium-xcode\": \"^6.0.0\",\n        \"async-lock\": \"^1.0.0\",\n        \"asyncbox\": \"^6.0.1\",\n        \"bluebird\": \"^3.5.1\",\n        \"lodash\": \"^4.2.1\",\n        \"node-simctl\": \"^8.1.1\",\n        \"semver\": \"^7.0.0\",\n        \"teen_process\": \"^4.0.4\"\n      },\n      \"engines\": {\n        \"node\": \"^20.19.0 || ^22.12.0 || >=24.0.0\",\n        \"npm\": \">=10\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/appium-ios-tuntap\": {\n      \"version\": \"0.1.5\",\n      \"resolved\": \"https://registry.npmjs.org/appium-ios-tuntap/-/appium-ios-tuntap-0.1.5.tgz\",\n      \"integrity\": \"sha512-xvYpeqVGl4VgJTDm7ExtwIEalfkfzYoPgC4Tf8a6mX5zX7R5fDzMBO4K7+87c2VSrsHl4R5sSFmmCFkNkTZKxQ==\",\n      \"hasInstallScript\": true,\n      \"license\": \"Apache-2.0\",\n      \"optional\": true,\n      \"dependencies\": {\n        \"@appium/support\": \"^7.0.0-rc.1\",\n        \"node-addon-api\": \"^8.5.0\",\n        \"typescript\": \"^5.8.3\"\n      },\n      \"engines\": {\n        \"node\": \"^20.19.0 || ^22.12.0 || >=24.0.0\",\n        \"npm\": \">=10\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/appium-ios-tuntap/node_modules/typescript\": {\n      \"version\": \"5.9.3\",\n      \"resolved\": \"https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz\",\n      \"integrity\": \"sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==\",\n      \"license\": \"Apache-2.0\",\n      \"optional\": true,\n      \"bin\": {\n        \"tsc\": \"bin/tsc\",\n        \"tsserver\": \"bin/tsserver\"\n      },\n      \"engines\": {\n        \"node\": \">=14.17\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/appium-remote-debugger\": {\n      \"version\": \"15.6.0\",\n      \"resolved\": \"https://registry.npmjs.org/appium-remote-debugger/-/appium-remote-debugger-15.6.0.tgz\",\n      \"integrity\": \"sha512-vyN2PO/hQ+/DC9ZuY0r6xjg9zedltkSKuUJx3WfVZpgvv/al9uE/AYzk5C/arlwMjAR6Ci+LJFOHUtfDJweTSA==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"@appium/base-driver\": \"^10.0.0-rc.1\",\n        \"@appium/support\": \"^7.0.0-rc.1\",\n        \"appium-ios-device\": \"^3.0.0\",\n        \"async-lock\": \"^1.4.1\",\n        \"asyncbox\": \"^6.1.0\",\n        \"bluebird\": \"^3.4.7\",\n        \"glob\": \"^13.0.0\",\n        \"lodash\": \"^4.17.11\",\n        \"teen_process\": \"^4.0.4\"\n      },\n      \"engines\": {\n        \"node\": \"^20.19.0 || ^22.12.0 || >=24.0.0\",\n        \"npm\": \">=10\"\n      },\n      \"optionalDependencies\": {\n        \"appium-ios-remotexpc\": \"^0.x\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/appium-webdriveragent\": {\n      \"version\": \"11.4.1\",\n      \"resolved\": \"https://registry.npmjs.org/appium-webdriveragent/-/appium-webdriveragent-11.4.1.tgz\",\n      \"integrity\": \"sha512-VjYMujzNGmm42SVwL3HwJfZlzVzbguWwAyq7x0nk+6rRb6Y66xghRrWRAxz01vtE4TfUA5Mc6FcXlw4+agB6PA==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"@appium/base-driver\": \"^10.0.0-rc.1\",\n        \"@appium/strongbox\": \"^1.0.0-rc.1\",\n        \"@appium/support\": \"^7.0.0-rc.1\",\n        \"appium-ios-device\": \"^3.0.0\",\n        \"appium-ios-simulator\": \"^8.0.0\",\n        \"async-lock\": \"^1.0.0\",\n        \"asyncbox\": \"^6.1.0\",\n        \"axios\": \"^1.4.0\",\n        \"bluebird\": \"^3.5.5\",\n        \"lodash\": \"^4.17.11\",\n        \"teen_process\": \"^4.0.7\"\n      },\n      \"engines\": {\n        \"node\": \"^20.19.0 || ^22.12.0 || >=24.0.0\",\n        \"npm\": \">=10\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/appium-xcode\": {\n      \"version\": \"6.1.9\",\n      \"resolved\": \"https://registry.npmjs.org/appium-xcode/-/appium-xcode-6.1.9.tgz\",\n      \"integrity\": \"sha512-m7bQPXMUitycAvPNmNQ/UdoZJhtcH2zCjxXcvQYi4uZTHqexcjy76MpMrVFsESJ7Qd8+0U2vmnMNpfB/M/BupQ==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"@appium/support\": \"^7.0.0-rc.1\",\n        \"asyncbox\": \"^6.0.1\",\n        \"bluebird\": \"^3.7.2\",\n        \"lodash\": \"^4.17.4\",\n        \"plist\": \"^3.0.1\",\n        \"semver\": \"^7.0.0\",\n        \"teen_process\": \"^4.0.4\"\n      },\n      \"engines\": {\n        \"node\": \"^20.19.0 || ^22.12.0 || >=24.0.0\",\n        \"npm\": \">=10\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/archiver\": {\n      \"version\": \"7.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/archiver/-/archiver-7.0.1.tgz\",\n      \"integrity\": \"sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"archiver-utils\": \"^5.0.2\",\n        \"async\": \"^3.2.4\",\n        \"buffer-crc32\": \"^1.0.0\",\n        \"readable-stream\": \"^4.0.0\",\n        \"readdir-glob\": \"^1.1.2\",\n        \"tar-stream\": \"^3.0.0\",\n        \"zip-stream\": \"^6.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 14\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/archiver-utils\": {\n      \"version\": \"5.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/archiver-utils/-/archiver-utils-5.0.2.tgz\",\n      \"integrity\": \"sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"glob\": \"^10.0.0\",\n        \"graceful-fs\": \"^4.2.0\",\n        \"is-stream\": \"^2.0.1\",\n        \"lazystream\": \"^1.0.0\",\n        \"lodash\": \"^4.17.15\",\n        \"normalize-path\": \"^3.0.0\",\n        \"readable-stream\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 14\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/archiver-utils/node_modules/balanced-match\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz\",\n      \"integrity\": \"sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/archiver-utils/node_modules/brace-expansion\": {\n      \"version\": \"2.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz\",\n      \"integrity\": \"sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"balanced-match\": \"^1.0.0\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/archiver-utils/node_modules/glob\": {\n      \"version\": \"10.5.0\",\n      \"resolved\": \"https://registry.npmjs.org/glob/-/glob-10.5.0.tgz\",\n      \"integrity\": \"sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==\",\n      \"deprecated\": \"Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me\",\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"foreground-child\": \"^3.1.0\",\n        \"jackspeak\": \"^3.1.2\",\n        \"minimatch\": \"^9.0.4\",\n        \"minipass\": \"^7.1.2\",\n        \"package-json-from-dist\": \"^1.0.0\",\n        \"path-scurry\": \"^1.11.1\"\n      },\n      \"bin\": {\n        \"glob\": \"dist/esm/bin.mjs\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/archiver-utils/node_modules/lru-cache\": {\n      \"version\": \"10.4.3\",\n      \"resolved\": \"https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz\",\n      \"integrity\": \"sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==\",\n      \"license\": \"ISC\"\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/archiver-utils/node_modules/minimatch\": {\n      \"version\": \"9.0.9\",\n      \"resolved\": \"https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz\",\n      \"integrity\": \"sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==\",\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"brace-expansion\": \"^2.0.2\"\n      },\n      \"engines\": {\n        \"node\": \">=16 || 14 >=14.17\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/archiver-utils/node_modules/path-scurry\": {\n      \"version\": \"1.11.1\",\n      \"resolved\": \"https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz\",\n      \"integrity\": \"sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==\",\n      \"license\": \"BlueOak-1.0.0\",\n      \"dependencies\": {\n        \"lru-cache\": \"^10.2.0\",\n        \"minipass\": \"^5.0.0 || ^6.0.2 || ^7.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=16 || 14 >=14.18\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/async\": {\n      \"version\": \"3.2.6\",\n      \"resolved\": \"https://registry.npmjs.org/async/-/async-3.2.6.tgz\",\n      \"integrity\": \"sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/async-lock\": {\n      \"version\": \"1.4.1\",\n      \"resolved\": \"https://registry.npmjs.org/async-lock/-/async-lock-1.4.1.tgz\",\n      \"integrity\": \"sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/asyncbox\": {\n      \"version\": \"6.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/asyncbox/-/asyncbox-6.1.0.tgz\",\n      \"integrity\": \"sha512-KZwKNVnDdDe0ubN+fFMuHhSljZNHnbjdJABImoqFzQP61oIg6sMlhXIqOIu3WRd7YwW89q+eVj2Ty/Ax5dbh2Q==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"p-limit\": \"^7.2.0\"\n      },\n      \"engines\": {\n        \"node\": \"^20.19.0 || ^22.12.0 || >=24.0.0\",\n        \"npm\": \">=10\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/asynckit\": {\n      \"version\": \"0.4.0\",\n      \"resolved\": \"https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz\",\n      \"integrity\": \"sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/axios\": {\n      \"version\": \"1.15.0\",\n      \"resolved\": \"https://registry.npmjs.org/axios/-/axios-1.15.0.tgz\",\n      \"integrity\": \"sha512-wWyJDlAatxk30ZJer+GeCWS209sA42X+N5jU2jy6oHTp7ufw8uzUTVFBX9+wTfAlhiJXGS0Bq7X6efruWjuK9Q==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"follow-redirects\": \"^1.15.11\",\n        \"form-data\": \"^4.0.5\",\n        \"proxy-from-env\": \"^2.1.0\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/b4a\": {\n      \"version\": \"1.8.0\",\n      \"resolved\": \"https://registry.npmjs.org/b4a/-/b4a-1.8.0.tgz\",\n      \"integrity\": \"sha512-qRuSmNSkGQaHwNbM7J78Wwy+ghLEYF1zNrSeMxj4Kgw6y33O3mXcQ6Ie9fRvfU/YnxWkOchPXbaLb73TkIsfdg==\",\n      \"license\": \"Apache-2.0\",\n      \"peerDependencies\": {\n        \"react-native-b4a\": \"*\"\n      },\n      \"peerDependenciesMeta\": {\n        \"react-native-b4a\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/balanced-match\": {\n      \"version\": \"4.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz\",\n      \"integrity\": \"sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \"18 || 20 || >=22\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/bare-events\": {\n      \"version\": \"2.8.2\",\n      \"resolved\": \"https://registry.npmjs.org/bare-events/-/bare-events-2.8.2.tgz\",\n      \"integrity\": \"sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==\",\n      \"license\": \"Apache-2.0\",\n      \"peerDependencies\": {\n        \"bare-abort-controller\": \"*\"\n      },\n      \"peerDependenciesMeta\": {\n        \"bare-abort-controller\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/bare-fs\": {\n      \"version\": \"4.7.0\",\n      \"resolved\": \"https://registry.npmjs.org/bare-fs/-/bare-fs-4.7.0.tgz\",\n      \"integrity\": \"sha512-xzqKsCFxAek9aezYhjJuJRXBIaYlg/0OGDTZp+T8eYmYMlm66cs6cYko02drIyjN2CBbi+I6L7YfXyqpqtKRXA==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"bare-events\": \"^2.5.4\",\n        \"bare-path\": \"^3.0.0\",\n        \"bare-stream\": \"^2.6.4\",\n        \"bare-url\": \"^2.2.2\",\n        \"fast-fifo\": \"^1.3.2\"\n      },\n      \"engines\": {\n        \"bare\": \">=1.16.0\"\n      },\n      \"peerDependencies\": {\n        \"bare-buffer\": \"*\"\n      },\n      \"peerDependenciesMeta\": {\n        \"bare-buffer\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/bare-os\": {\n      \"version\": \"3.8.7\",\n      \"resolved\": \"https://registry.npmjs.org/bare-os/-/bare-os-3.8.7.tgz\",\n      \"integrity\": \"sha512-G4Gr1UsGeEy2qtDTZwL7JFLo2wapUarz7iTMcYcMFdS89AIQuBoyjgXZz0Utv7uHs3xA9LckhVbeBi8lEQrC+w==\",\n      \"license\": \"Apache-2.0\",\n      \"engines\": {\n        \"bare\": \">=1.14.0\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/bare-path\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz\",\n      \"integrity\": \"sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"bare-os\": \"^3.0.1\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/bare-stream\": {\n      \"version\": \"2.12.0\",\n      \"resolved\": \"https://registry.npmjs.org/bare-stream/-/bare-stream-2.12.0.tgz\",\n      \"integrity\": \"sha512-w28i8lkBgREV3rPXGbgK+BO66q+ZpKqRWrZLiCdmmUlLPrQ45CzkvRhN+7lnv00Gpi2zy5naRxnUFAxCECDm9g==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"streamx\": \"^2.25.0\",\n        \"teex\": \"^1.0.1\"\n      },\n      \"peerDependencies\": {\n        \"bare-abort-controller\": \"*\",\n        \"bare-buffer\": \"*\",\n        \"bare-events\": \"*\"\n      },\n      \"peerDependenciesMeta\": {\n        \"bare-abort-controller\": {\n          \"optional\": true\n        },\n        \"bare-buffer\": {\n          \"optional\": true\n        },\n        \"bare-events\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/bare-url\": {\n      \"version\": \"2.4.0\",\n      \"resolved\": \"https://registry.npmjs.org/bare-url/-/bare-url-2.4.0.tgz\",\n      \"integrity\": \"sha512-NSTU5WN+fy/L0DDenfE8SXQna4voXuW0FHM7wH8i3/q9khUSchfPbPezO4zSFMnDGIf9YE+mt/RWhZgNRKRIXA==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"bare-path\": \"^3.0.0\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/base64-js\": {\n      \"version\": \"1.5.1\",\n      \"resolved\": \"https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz\",\n      \"integrity\": \"sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==\",\n      \"funding\": [\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/feross\"\n        },\n        {\n          \"type\": \"patreon\",\n          \"url\": \"https://www.patreon.com/feross\"\n        },\n        {\n          \"type\": \"consulting\",\n          \"url\": \"https://feross.org/support\"\n        }\n      ],\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/base64-stream\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/base64-stream/-/base64-stream-1.0.0.tgz\",\n      \"integrity\": \"sha512-BQQZftaO48FcE1Kof9CmXMFaAdqkcNorgc8CxesZv9nMbbTF1EFyQe89UOuh//QMmdtfUDXyO8rgUalemL5ODA==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/basic-auth\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz\",\n      \"integrity\": \"sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"safe-buffer\": \"5.1.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/big-integer\": {\n      \"version\": \"1.6.52\",\n      \"resolved\": \"https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz\",\n      \"integrity\": \"sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==\",\n      \"license\": \"Unlicense\",\n      \"engines\": {\n        \"node\": \">=0.6\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/bluebird\": {\n      \"version\": \"3.7.2\",\n      \"resolved\": \"https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz\",\n      \"integrity\": \"sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/body-parser\": {\n      \"version\": \"2.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz\",\n      \"integrity\": \"sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"bytes\": \"^3.1.2\",\n        \"content-type\": \"^1.0.5\",\n        \"debug\": \"^4.4.3\",\n        \"http-errors\": \"^2.0.0\",\n        \"iconv-lite\": \"^0.7.0\",\n        \"on-finished\": \"^2.4.1\",\n        \"qs\": \"^6.14.1\",\n        \"raw-body\": \"^3.0.1\",\n        \"type-is\": \"^2.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/express\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/bplist-creator\": {\n      \"version\": \"0.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.1.1.tgz\",\n      \"integrity\": \"sha512-Ese7052fdWrxp/vqSJkydgx/1MdBnNOCV2XVfbmdGWD2H6EYza+Q4pyYSuVSnCUD22hfI/BFI4jHaC3NLXLlJQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"stream-buffers\": \"2.2.x\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/bplist-parser\": {\n      \"version\": \"0.3.2\",\n      \"resolved\": \"https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz\",\n      \"integrity\": \"sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"big-integer\": \"1.6.x\"\n      },\n      \"engines\": {\n        \"node\": \">= 5.10.0\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/brace-expansion\": {\n      \"version\": \"5.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz\",\n      \"integrity\": \"sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"balanced-match\": \"^4.0.2\"\n      },\n      \"engines\": {\n        \"node\": \"18 || 20 || >=22\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/buffer-crc32\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz\",\n      \"integrity\": \"sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=8.0.0\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/bytes\": {\n      \"version\": \"3.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz\",\n      \"integrity\": \"sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/call-bind-apply-helpers\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz\",\n      \"integrity\": \"sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"es-errors\": \"^1.3.0\",\n        \"function-bind\": \"^1.1.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/call-bound\": {\n      \"version\": \"1.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz\",\n      \"integrity\": \"sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"call-bind-apply-helpers\": \"^1.0.2\",\n        \"get-intrinsic\": \"^1.3.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/color\": {\n      \"version\": \"5.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/color/-/color-5.0.3.tgz\",\n      \"integrity\": \"sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"color-convert\": \"^3.1.3\",\n        \"color-string\": \"^2.1.3\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/color-convert\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz\",\n      \"integrity\": \"sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"color-name\": \"~1.1.4\"\n      },\n      \"engines\": {\n        \"node\": \">=7.0.0\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/color-name\": {\n      \"version\": \"1.1.4\",\n      \"resolved\": \"https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz\",\n      \"integrity\": \"sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/color-string\": {\n      \"version\": \"2.1.4\",\n      \"resolved\": \"https://registry.npmjs.org/color-string/-/color-string-2.1.4.tgz\",\n      \"integrity\": \"sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"color-name\": \"^2.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/color-string/node_modules/color-name\": {\n      \"version\": \"2.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz\",\n      \"integrity\": \"sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=12.20\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/color/node_modules/color-convert\": {\n      \"version\": \"3.1.3\",\n      \"resolved\": \"https://registry.npmjs.org/color-convert/-/color-convert-3.1.3.tgz\",\n      \"integrity\": \"sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"color-name\": \"^2.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=14.6\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/color/node_modules/color-name\": {\n      \"version\": \"2.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz\",\n      \"integrity\": \"sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=12.20\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/combined-stream\": {\n      \"version\": \"1.0.8\",\n      \"resolved\": \"https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz\",\n      \"integrity\": \"sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"delayed-stream\": \"~1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/commander\": {\n      \"version\": \"14.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/commander/-/commander-14.0.3.tgz\",\n      \"integrity\": \"sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=20\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/compress-commons\": {\n      \"version\": \"6.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.2.tgz\",\n      \"integrity\": \"sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"crc-32\": \"^1.2.0\",\n        \"crc32-stream\": \"^6.0.0\",\n        \"is-stream\": \"^2.0.1\",\n        \"normalize-path\": \"^3.0.0\",\n        \"readable-stream\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 14\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/console-control-strings\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz\",\n      \"integrity\": \"sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==\",\n      \"license\": \"ISC\"\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/content-disposition\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/content-disposition/-/content-disposition-1.1.0.tgz\",\n      \"integrity\": \"sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/express\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/content-type\": {\n      \"version\": \"1.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz\",\n      \"integrity\": \"sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.6\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/cookie\": {\n      \"version\": \"0.7.2\",\n      \"resolved\": \"https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz\",\n      \"integrity\": \"sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.6\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/cookie-signature\": {\n      \"version\": \"1.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz\",\n      \"integrity\": \"sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=6.6.0\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/core-util-is\": {\n      \"version\": \"1.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz\",\n      \"integrity\": \"sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/crc-32\": {\n      \"version\": \"1.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz\",\n      \"integrity\": \"sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==\",\n      \"license\": \"Apache-2.0\",\n      \"bin\": {\n        \"crc32\": \"bin/crc32.njs\"\n      },\n      \"engines\": {\n        \"node\": \">=0.8\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/crc32-stream\": {\n      \"version\": \"6.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/crc32-stream/-/crc32-stream-6.0.0.tgz\",\n      \"integrity\": \"sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"crc-32\": \"^1.2.0\",\n        \"readable-stream\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 14\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/cross-spawn\": {\n      \"version\": \"7.0.6\",\n      \"resolved\": \"https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz\",\n      \"integrity\": \"sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"path-key\": \"^3.1.0\",\n        \"shebang-command\": \"^2.0.0\",\n        \"which\": \"^2.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 8\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/cross-spawn/node_modules/isexe\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz\",\n      \"integrity\": \"sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==\",\n      \"license\": \"ISC\"\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/cross-spawn/node_modules/which\": {\n      \"version\": \"2.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/which/-/which-2.0.2.tgz\",\n      \"integrity\": \"sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==\",\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"isexe\": \"^2.0.0\"\n      },\n      \"bin\": {\n        \"node-which\": \"bin/node-which\"\n      },\n      \"engines\": {\n        \"node\": \">= 8\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/css-selector-parser\": {\n      \"version\": \"3.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/css-selector-parser/-/css-selector-parser-3.3.0.tgz\",\n      \"integrity\": \"sha512-Y2asgMGFqJKF4fq4xHDSlFYIkeVfRsm69lQC1q9kbEsH5XtnINTMrweLkjYMeaUgiXBy/uvKeO/a1JHTNnmB2g==\",\n      \"funding\": [\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/mdevils\"\n        },\n        {\n          \"type\": \"patreon\",\n          \"url\": \"https://patreon.com/mdevils\"\n        }\n      ],\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/debug\": {\n      \"version\": \"4.4.3\",\n      \"resolved\": \"https://registry.npmjs.org/debug/-/debug-4.4.3.tgz\",\n      \"integrity\": \"sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"ms\": \"^2.1.3\"\n      },\n      \"engines\": {\n        \"node\": \">=6.0\"\n      },\n      \"peerDependenciesMeta\": {\n        \"supports-color\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/delayed-stream\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz\",\n      \"integrity\": \"sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=0.4.0\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/depd\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/depd/-/depd-2.0.0.tgz\",\n      \"integrity\": \"sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/detect-libc\": {\n      \"version\": \"2.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz\",\n      \"integrity\": \"sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==\",\n      \"license\": \"Apache-2.0\",\n      \"optional\": true,\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/detect-node\": {\n      \"version\": \"2.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz\",\n      \"integrity\": \"sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==\",\n      \"license\": \"MIT\",\n      \"optional\": true\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/dnssd\": {\n      \"version\": \"0.4.1\",\n      \"resolved\": \"https://registry.npmjs.org/dnssd/-/dnssd-0.4.1.tgz\",\n      \"integrity\": \"sha512-mEz5Ii+o+k3kYHTXY6fTLOjCwraX8TQowIgUySAbEYuGqtSMbfBc/tvDZ8wGPywnmlLE6/XeXi6qPcAKVTvPUQ==\",\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"bin\": {\n        \"dnssd-js\": \"bin/bin.js\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/dunder-proto\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz\",\n      \"integrity\": \"sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"call-bind-apply-helpers\": \"^1.0.1\",\n        \"es-errors\": \"^1.3.0\",\n        \"gopd\": \"^1.2.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/duplexer\": {\n      \"version\": \"0.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz\",\n      \"integrity\": \"sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/eastasianwidth\": {\n      \"version\": \"0.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz\",\n      \"integrity\": \"sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/ee-first\": {\n      \"version\": \"1.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz\",\n      \"integrity\": \"sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/emoji-regex\": {\n      \"version\": \"8.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz\",\n      \"integrity\": \"sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/enabled\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz\",\n      \"integrity\": \"sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/encodeurl\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz\",\n      \"integrity\": \"sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/env-paths\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/env-paths/-/env-paths-4.0.0.tgz\",\n      \"integrity\": \"sha512-pxP8eL2SwwaTRi/KHYwLYXinDs7gL3jxFcBYmEdYfZmZXbaVDvdppd0XBU8qVz03rDfKZMXg1omHCbsJjZrMsw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"is-safe-filename\": \"^0.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">=20\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/es-define-property\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz\",\n      \"integrity\": \"sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/es-errors\": {\n      \"version\": \"1.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz\",\n      \"integrity\": \"sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/es-object-atoms\": {\n      \"version\": \"1.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz\",\n      \"integrity\": \"sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"es-errors\": \"^1.3.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/es-set-tostringtag\": {\n      \"version\": \"2.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz\",\n      \"integrity\": \"sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"es-errors\": \"^1.3.0\",\n        \"get-intrinsic\": \"^1.2.6\",\n        \"has-tostringtag\": \"^1.0.2\",\n        \"hasown\": \"^2.0.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/escape-html\": {\n      \"version\": \"1.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz\",\n      \"integrity\": \"sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/etag\": {\n      \"version\": \"1.8.1\",\n      \"resolved\": \"https://registry.npmjs.org/etag/-/etag-1.8.1.tgz\",\n      \"integrity\": \"sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.6\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/event-target-shim\": {\n      \"version\": \"5.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz\",\n      \"integrity\": \"sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/events\": {\n      \"version\": \"3.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/events/-/events-3.3.0.tgz\",\n      \"integrity\": \"sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=0.8.x\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/events-universal\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz\",\n      \"integrity\": \"sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"bare-events\": \"^2.7.0\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/express\": {\n      \"version\": \"5.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/express/-/express-5.2.1.tgz\",\n      \"integrity\": \"sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"accepts\": \"^2.0.0\",\n        \"body-parser\": \"^2.2.1\",\n        \"content-disposition\": \"^1.0.0\",\n        \"content-type\": \"^1.0.5\",\n        \"cookie\": \"^0.7.1\",\n        \"cookie-signature\": \"^1.2.1\",\n        \"debug\": \"^4.4.0\",\n        \"depd\": \"^2.0.0\",\n        \"encodeurl\": \"^2.0.0\",\n        \"escape-html\": \"^1.0.3\",\n        \"etag\": \"^1.8.1\",\n        \"finalhandler\": \"^2.1.0\",\n        \"fresh\": \"^2.0.0\",\n        \"http-errors\": \"^2.0.0\",\n        \"merge-descriptors\": \"^2.0.0\",\n        \"mime-types\": \"^3.0.0\",\n        \"on-finished\": \"^2.4.1\",\n        \"once\": \"^1.4.0\",\n        \"parseurl\": \"^1.3.3\",\n        \"proxy-addr\": \"^2.0.7\",\n        \"qs\": \"^6.14.0\",\n        \"range-parser\": \"^1.2.1\",\n        \"router\": \"^2.2.0\",\n        \"send\": \"^1.1.0\",\n        \"serve-static\": \"^2.2.0\",\n        \"statuses\": \"^2.0.1\",\n        \"type-is\": \"^2.0.1\",\n        \"vary\": \"^1.1.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 18\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/express\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/fast-fifo\": {\n      \"version\": \"1.3.2\",\n      \"resolved\": \"https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz\",\n      \"integrity\": \"sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/fastest-levenshtein\": {\n      \"version\": \"1.0.16\",\n      \"resolved\": \"https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz\",\n      \"integrity\": \"sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 4.9.1\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/fecha\": {\n      \"version\": \"4.2.3\",\n      \"resolved\": \"https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz\",\n      \"integrity\": \"sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/finalhandler\": {\n      \"version\": \"2.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz\",\n      \"integrity\": \"sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"debug\": \"^4.4.0\",\n        \"encodeurl\": \"^2.0.0\",\n        \"escape-html\": \"^1.0.3\",\n        \"on-finished\": \"^2.4.1\",\n        \"parseurl\": \"^1.3.3\",\n        \"statuses\": \"^2.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 18.0.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/express\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/find-up-simple\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.1.tgz\",\n      \"integrity\": \"sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/fn.name\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz\",\n      \"integrity\": \"sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/follow-redirects\": {\n      \"version\": \"1.15.11\",\n      \"resolved\": \"https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz\",\n      \"integrity\": \"sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==\",\n      \"funding\": [\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://github.com/sponsors/RubenVerborgh\"\n        }\n      ],\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=4.0\"\n      },\n      \"peerDependenciesMeta\": {\n        \"debug\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/foreground-child\": {\n      \"version\": \"3.3.1\",\n      \"resolved\": \"https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz\",\n      \"integrity\": \"sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==\",\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"cross-spawn\": \"^7.0.6\",\n        \"signal-exit\": \"^4.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=14\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/foreground-child/node_modules/signal-exit\": {\n      \"version\": \"4.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz\",\n      \"integrity\": \"sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==\",\n      \"license\": \"ISC\",\n      \"engines\": {\n        \"node\": \">=14\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/form-data\": {\n      \"version\": \"4.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz\",\n      \"integrity\": \"sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"asynckit\": \"^0.4.0\",\n        \"combined-stream\": \"^1.0.8\",\n        \"es-set-tostringtag\": \"^2.1.0\",\n        \"hasown\": \"^2.0.2\",\n        \"mime-types\": \"^2.1.12\"\n      },\n      \"engines\": {\n        \"node\": \">= 6\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/form-data/node_modules/mime-db\": {\n      \"version\": \"1.52.0\",\n      \"resolved\": \"https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz\",\n      \"integrity\": \"sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.6\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/form-data/node_modules/mime-types\": {\n      \"version\": \"2.1.35\",\n      \"resolved\": \"https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz\",\n      \"integrity\": \"sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"mime-db\": \"1.52.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.6\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/forwarded\": {\n      \"version\": \"0.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz\",\n      \"integrity\": \"sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.6\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/fresh\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz\",\n      \"integrity\": \"sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/ftp-response-parser\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/ftp-response-parser/-/ftp-response-parser-1.0.1.tgz\",\n      \"integrity\": \"sha512-++Ahlo2hs/IC7UVQzjcSAfeUpCwTTzs4uvG5XfGnsinIFkWUYF4xWwPd5qZuK8MJrmUIxFMuHcfqaosCDjvIWw==\",\n      \"dependencies\": {\n        \"readable-stream\": \"^1.0.31\"\n      },\n      \"engines\": {\n        \"node\": \">=0.8.0\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/ftp-response-parser/node_modules/isarray\": {\n      \"version\": \"0.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz\",\n      \"integrity\": \"sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/ftp-response-parser/node_modules/readable-stream\": {\n      \"version\": \"1.1.14\",\n      \"resolved\": \"https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz\",\n      \"integrity\": \"sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"core-util-is\": \"~1.0.0\",\n        \"inherits\": \"~2.0.1\",\n        \"isarray\": \"0.0.1\",\n        \"string_decoder\": \"~0.10.x\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/ftp-response-parser/node_modules/string_decoder\": {\n      \"version\": \"0.10.31\",\n      \"resolved\": \"https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz\",\n      \"integrity\": \"sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/function-bind\": {\n      \"version\": \"1.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz\",\n      \"integrity\": \"sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==\",\n      \"license\": \"MIT\",\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/get-intrinsic\": {\n      \"version\": \"1.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz\",\n      \"integrity\": \"sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"call-bind-apply-helpers\": \"^1.0.2\",\n        \"es-define-property\": \"^1.0.1\",\n        \"es-errors\": \"^1.3.0\",\n        \"es-object-atoms\": \"^1.1.1\",\n        \"function-bind\": \"^1.1.2\",\n        \"get-proto\": \"^1.0.1\",\n        \"gopd\": \"^1.2.0\",\n        \"has-symbols\": \"^1.1.0\",\n        \"hasown\": \"^2.0.2\",\n        \"math-intrinsics\": \"^1.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/get-proto\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz\",\n      \"integrity\": \"sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"dunder-proto\": \"^1.0.1\",\n        \"es-object-atoms\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/get-stream\": {\n      \"version\": \"9.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz\",\n      \"integrity\": \"sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@sec-ant/readable-stream\": \"^0.4.1\",\n        \"is-stream\": \"^4.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/get-stream/node_modules/is-stream\": {\n      \"version\": \"4.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz\",\n      \"integrity\": \"sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/glob\": {\n      \"version\": \"13.0.6\",\n      \"resolved\": \"https://registry.npmjs.org/glob/-/glob-13.0.6.tgz\",\n      \"integrity\": \"sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==\",\n      \"license\": \"BlueOak-1.0.0\",\n      \"dependencies\": {\n        \"minimatch\": \"^10.2.2\",\n        \"minipass\": \"^7.1.3\",\n        \"path-scurry\": \"^2.0.2\"\n      },\n      \"engines\": {\n        \"node\": \"18 || 20 || >=22\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/gopd\": {\n      \"version\": \"1.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz\",\n      \"integrity\": \"sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/graceful-fs\": {\n      \"version\": \"4.2.11\",\n      \"resolved\": \"https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz\",\n      \"integrity\": \"sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==\",\n      \"license\": \"ISC\"\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/handle-thing\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz\",\n      \"integrity\": \"sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==\",\n      \"license\": \"MIT\",\n      \"optional\": true\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/has-symbols\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz\",\n      \"integrity\": \"sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/has-tostringtag\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz\",\n      \"integrity\": \"sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"has-symbols\": \"^1.0.3\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/hasown\": {\n      \"version\": \"2.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz\",\n      \"integrity\": \"sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"function-bind\": \"^1.1.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/hosted-git-info\": {\n      \"version\": \"9.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-9.0.2.tgz\",\n      \"integrity\": \"sha512-M422h7o/BR3rmCQ8UHi7cyyMqKltdP9Uo+J2fXK+RSAY+wTcKOIRyhTuKv4qn+DJf3g+PL890AzId5KZpX+CBg==\",\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"lru-cache\": \"^11.1.0\"\n      },\n      \"engines\": {\n        \"node\": \"^20.17.0 || >=22.9.0\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/hpack.js\": {\n      \"version\": \"2.1.6\",\n      \"resolved\": \"https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz\",\n      \"integrity\": \"sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==\",\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"dependencies\": {\n        \"inherits\": \"^2.0.1\",\n        \"obuf\": \"^1.0.0\",\n        \"readable-stream\": \"^2.0.1\",\n        \"wbuf\": \"^1.1.0\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/hpack.js/node_modules/readable-stream\": {\n      \"version\": \"2.3.8\",\n      \"resolved\": \"https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz\",\n      \"integrity\": \"sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==\",\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"dependencies\": {\n        \"core-util-is\": \"~1.0.0\",\n        \"inherits\": \"~2.0.3\",\n        \"isarray\": \"~1.0.0\",\n        \"process-nextick-args\": \"~2.0.0\",\n        \"safe-buffer\": \"~5.1.1\",\n        \"string_decoder\": \"~1.1.1\",\n        \"util-deprecate\": \"~1.0.1\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/hpack.js/node_modules/string_decoder\": {\n      \"version\": \"1.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz\",\n      \"integrity\": \"sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==\",\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"dependencies\": {\n        \"safe-buffer\": \"~5.1.0\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/http-deceiver\": {\n      \"version\": \"1.2.7\",\n      \"resolved\": \"https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz\",\n      \"integrity\": \"sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==\",\n      \"license\": \"MIT\",\n      \"optional\": true\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/http-errors\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz\",\n      \"integrity\": \"sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"depd\": \"~2.0.0\",\n        \"inherits\": \"~2.0.4\",\n        \"setprototypeof\": \"~1.2.0\",\n        \"statuses\": \"~2.0.2\",\n        \"toidentifier\": \"~1.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/express\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/http-status-codes\": {\n      \"version\": \"2.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/http-status-codes/-/http-status-codes-2.3.0.tgz\",\n      \"integrity\": \"sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/iconv-lite\": {\n      \"version\": \"0.7.2\",\n      \"resolved\": \"https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz\",\n      \"integrity\": \"sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"safer-buffer\": \">= 2.1.2 < 3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/express\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/ieee754\": {\n      \"version\": \"1.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz\",\n      \"integrity\": \"sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==\",\n      \"funding\": [\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/feross\"\n        },\n        {\n          \"type\": \"patreon\",\n          \"url\": \"https://www.patreon.com/feross\"\n        },\n        {\n          \"type\": \"consulting\",\n          \"url\": \"https://feross.org/support\"\n        }\n      ],\n      \"license\": \"BSD-3-Clause\"\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/index-to-position\": {\n      \"version\": \"1.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/index-to-position/-/index-to-position-1.2.0.tgz\",\n      \"integrity\": \"sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/inherits\": {\n      \"version\": \"2.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz\",\n      \"integrity\": \"sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==\",\n      \"license\": \"ISC\"\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/ipaddr.js\": {\n      \"version\": \"1.9.1\",\n      \"resolved\": \"https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz\",\n      \"integrity\": \"sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.10\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/is-fullwidth-code-point\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz\",\n      \"integrity\": \"sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/is-number-like\": {\n      \"version\": \"1.0.8\",\n      \"resolved\": \"https://registry.npmjs.org/is-number-like/-/is-number-like-1.0.8.tgz\",\n      \"integrity\": \"sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==\",\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"lodash.isfinite\": \"^3.3.2\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/is-promise\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz\",\n      \"integrity\": \"sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/is-safe-filename\": {\n      \"version\": \"0.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/is-safe-filename/-/is-safe-filename-0.1.1.tgz\",\n      \"integrity\": \"sha512-4SrR7AdnY11LHfDKTZY1u6Ga3RuxZdl3YKWWShO5iyuG5h8QS4GD2tOb04peBJ5I7pXbR+CGBNEhTcwK+FzN3g==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=20\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/is-stream\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz\",\n      \"integrity\": \"sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=8\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/is-unicode-supported\": {\n      \"version\": \"2.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz\",\n      \"integrity\": \"sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/isarray\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz\",\n      \"integrity\": \"sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/isexe\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/isexe/-/isexe-4.0.0.tgz\",\n      \"integrity\": \"sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==\",\n      \"license\": \"BlueOak-1.0.0\",\n      \"engines\": {\n        \"node\": \">=20\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/jackspeak\": {\n      \"version\": \"3.4.3\",\n      \"resolved\": \"https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz\",\n      \"integrity\": \"sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==\",\n      \"license\": \"BlueOak-1.0.0\",\n      \"dependencies\": {\n        \"@isaacs/cliui\": \"^8.0.2\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      },\n      \"optionalDependencies\": {\n        \"@pkgjs/parseargs\": \"^0.11.0\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/js-tokens\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz\",\n      \"integrity\": \"sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/js2xmlparser2\": {\n      \"version\": \"0.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/js2xmlparser2/-/js2xmlparser2-0.2.0.tgz\",\n      \"integrity\": \"sha512-SzFGc1hQqzpDcalKmrM5gobSMGRSRg2lgaZrHGIfowrmd8+uaI+PWW62jcCGIqI+b4wdyYK0VKMhvVtJfkD0cg==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/jsftp\": {\n      \"version\": \"2.1.3\",\n      \"resolved\": \"https://registry.npmjs.org/jsftp/-/jsftp-2.1.3.tgz\",\n      \"integrity\": \"sha512-r79EVB8jaNAZbq8hvanL8e8JGu2ZNr2bXdHC4ZdQhRImpSPpnWwm5DYVzQ5QxJmtGtKhNNuvqGgbNaFl604fEQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"debug\": \"^3.1.0\",\n        \"ftp-response-parser\": \"^1.0.1\",\n        \"once\": \"^1.4.0\",\n        \"parse-listing\": \"^1.1.3\",\n        \"stream-combiner\": \"^0.2.2\",\n        \"unorm\": \"^1.4.1\"\n      },\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/jsftp/node_modules/debug\": {\n      \"version\": \"3.2.7\",\n      \"resolved\": \"https://registry.npmjs.org/debug/-/debug-3.2.7.tgz\",\n      \"integrity\": \"sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"ms\": \"^2.1.1\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/json-parse-even-better-errors\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-4.0.0.tgz\",\n      \"integrity\": \"sha512-lR4MXjGNgkJc7tkQ97kb2nuEMnNCyU//XYVH0MKTGcXEiSudQ5MKGKen3C5QubYy0vmq+JGitUg92uuywGEwIA==\",\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"engines\": {\n        \"node\": \"^18.17.0 || >=20.5.0\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/json-schema\": {\n      \"version\": \"0.4.0\",\n      \"resolved\": \"https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz\",\n      \"integrity\": \"sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==\",\n      \"license\": \"(AFL-2.1 OR BSD-3-Clause)\"\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/klaw\": {\n      \"version\": \"4.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/klaw/-/klaw-4.1.0.tgz\",\n      \"integrity\": \"sha512-1zGZ9MF9H22UnkpVeuaGKOjfA2t6WrfdrJmGjy16ykcjnKQDmHVX+KI477rpbGevz/5FD4MC3xf1oxylBgcaQw==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=14.14.0\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/kuler\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz\",\n      \"integrity\": \"sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/lazystream\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz\",\n      \"integrity\": \"sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"readable-stream\": \"^2.0.5\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.6.3\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/lazystream/node_modules/readable-stream\": {\n      \"version\": \"2.3.8\",\n      \"resolved\": \"https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz\",\n      \"integrity\": \"sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"core-util-is\": \"~1.0.0\",\n        \"inherits\": \"~2.0.3\",\n        \"isarray\": \"~1.0.0\",\n        \"process-nextick-args\": \"~2.0.0\",\n        \"safe-buffer\": \"~5.1.1\",\n        \"string_decoder\": \"~1.1.1\",\n        \"util-deprecate\": \"~1.0.1\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/lazystream/node_modules/string_decoder\": {\n      \"version\": \"1.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz\",\n      \"integrity\": \"sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"safe-buffer\": \"~5.1.0\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/lockfile\": {\n      \"version\": \"1.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/lockfile/-/lockfile-1.0.4.tgz\",\n      \"integrity\": \"sha512-cvbTwETRfsFh4nHsL1eGWapU1XFi5Ot9E85sWAwia7Y7EgB7vfqcZhTKZ+l7hCGxSPoushMv5GKhT5PdLv03WA==\",\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"signal-exit\": \"^3.0.2\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/lodash\": {\n      \"version\": \"4.18.1\",\n      \"resolved\": \"https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz\",\n      \"integrity\": \"sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/lodash.isfinite\": {\n      \"version\": \"3.3.2\",\n      \"resolved\": \"https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz\",\n      \"integrity\": \"sha512-7FGG40uhC8Mm633uKW1r58aElFlBlxCrg9JfSi3P6aYiWmfiWF0PgMd86ZUsxE5GwWPdHoS2+48bwTh2VPkIQA==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/log-symbols\": {\n      \"version\": \"7.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/log-symbols/-/log-symbols-7.0.1.tgz\",\n      \"integrity\": \"sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"is-unicode-supported\": \"^2.0.0\",\n        \"yoctocolors\": \"^2.1.1\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/logform\": {\n      \"version\": \"2.7.0\",\n      \"resolved\": \"https://registry.npmjs.org/logform/-/logform-2.7.0.tgz\",\n      \"integrity\": \"sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@colors/colors\": \"1.6.0\",\n        \"@types/triple-beam\": \"^1.3.2\",\n        \"fecha\": \"^4.2.0\",\n        \"ms\": \"^2.1.1\",\n        \"safe-stable-stringify\": \"^2.3.1\",\n        \"triple-beam\": \"^1.3.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 12.0.0\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/lru-cache\": {\n      \"version\": \"11.3.3\",\n      \"resolved\": \"https://registry.npmjs.org/lru-cache/-/lru-cache-11.3.3.tgz\",\n      \"integrity\": \"sha512-JvNw9Y81y33E+BEYPr0U7omo+U9AySnsMsEiXgwT6yqd31VQWTLNQqmT4ou5eqPFUrTfIDFta2wKhB1hyohtAQ==\",\n      \"license\": \"BlueOak-1.0.0\",\n      \"engines\": {\n        \"node\": \"20 || >=22\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/math-intrinsics\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz\",\n      \"integrity\": \"sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/media-typer\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz\",\n      \"integrity\": \"sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/memorystream\": {\n      \"version\": \"0.3.1\",\n      \"resolved\": \"https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz\",\n      \"integrity\": \"sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==\",\n      \"optional\": true,\n      \"engines\": {\n        \"node\": \">= 0.10.0\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/merge-descriptors\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz\",\n      \"integrity\": \"sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/method-override\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/method-override/-/method-override-3.0.0.tgz\",\n      \"integrity\": \"sha512-IJ2NNN/mSl9w3kzWB92rcdHpz+HjkxhDJWNDBqSlas+zQdP8wBiJzITPg08M/k2uVvMow7Sk41atndNtt/PHSA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"debug\": \"3.1.0\",\n        \"methods\": \"~1.1.2\",\n        \"parseurl\": \"~1.3.2\",\n        \"vary\": \"~1.1.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.10\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/method-override/node_modules/debug\": {\n      \"version\": \"3.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/debug/-/debug-3.1.0.tgz\",\n      \"integrity\": \"sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"ms\": \"2.0.0\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/method-override/node_modules/ms\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/ms/-/ms-2.0.0.tgz\",\n      \"integrity\": \"sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/methods\": {\n      \"version\": \"1.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/methods/-/methods-1.1.2.tgz\",\n      \"integrity\": \"sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.6\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/mime-db\": {\n      \"version\": \"1.54.0\",\n      \"resolved\": \"https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz\",\n      \"integrity\": \"sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.6\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/mime-types\": {\n      \"version\": \"3.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz\",\n      \"integrity\": \"sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"mime-db\": \"^1.54.0\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/express\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/minimalistic-assert\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz\",\n      \"integrity\": \"sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==\",\n      \"license\": \"ISC\",\n      \"optional\": true\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/minimatch\": {\n      \"version\": \"10.2.5\",\n      \"resolved\": \"https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz\",\n      \"integrity\": \"sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==\",\n      \"license\": \"BlueOak-1.0.0\",\n      \"dependencies\": {\n        \"brace-expansion\": \"^5.0.5\"\n      },\n      \"engines\": {\n        \"node\": \"18 || 20 || >=22\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/minipass\": {\n      \"version\": \"7.1.3\",\n      \"resolved\": \"https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz\",\n      \"integrity\": \"sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==\",\n      \"license\": \"BlueOak-1.0.0\",\n      \"engines\": {\n        \"node\": \">=16 || 14 >=14.17\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/moment\": {\n      \"version\": \"2.30.1\",\n      \"resolved\": \"https://registry.npmjs.org/moment/-/moment-2.30.1.tgz\",\n      \"integrity\": \"sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \"*\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/moment-timezone\": {\n      \"version\": \"0.6.1\",\n      \"resolved\": \"https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.6.1.tgz\",\n      \"integrity\": \"sha512-1B9lmAhB9D9/sHaPC1N7wLFEVUoFldxOpOO96lOD1PvJ43vCd0ozDPbu0FEL3++VvawOlDkq8YD373tJmP5JHw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"moment\": \"^2.29.4\"\n      },\n      \"engines\": {\n        \"node\": \"*\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/morgan\": {\n      \"version\": \"1.10.1\",\n      \"resolved\": \"https://registry.npmjs.org/morgan/-/morgan-1.10.1.tgz\",\n      \"integrity\": \"sha512-223dMRJtI/l25dJKWpgij2cMtywuG/WiUKXdvwfbhGKBhy1puASqXwFzmWZ7+K73vUPoR7SS2Qz2cI/g9MKw0A==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"basic-auth\": \"~2.0.1\",\n        \"debug\": \"2.6.9\",\n        \"depd\": \"~2.0.0\",\n        \"on-finished\": \"~2.3.0\",\n        \"on-headers\": \"~1.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.8.0\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/morgan/node_modules/debug\": {\n      \"version\": \"2.6.9\",\n      \"resolved\": \"https://registry.npmjs.org/debug/-/debug-2.6.9.tgz\",\n      \"integrity\": \"sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"ms\": \"2.0.0\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/morgan/node_modules/ms\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/ms/-/ms-2.0.0.tgz\",\n      \"integrity\": \"sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/morgan/node_modules/on-finished\": {\n      \"version\": \"2.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz\",\n      \"integrity\": \"sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"ee-first\": \"1.1.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/ms\": {\n      \"version\": \"2.1.3\",\n      \"resolved\": \"https://registry.npmjs.org/ms/-/ms-2.1.3.tgz\",\n      \"integrity\": \"sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/ncp\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz\",\n      \"integrity\": \"sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==\",\n      \"license\": \"MIT\",\n      \"bin\": {\n        \"ncp\": \"bin/ncp\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/negotiator\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz\",\n      \"integrity\": \"sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.6\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/node-addon-api\": {\n      \"version\": \"8.7.0\",\n      \"resolved\": \"https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.7.0.tgz\",\n      \"integrity\": \"sha512-9MdFxmkKaOYVTV+XVRG8ArDwwQ77XIgIPyKASB1k3JPq3M8fGQQQE3YpMOrKm6g//Ktx8ivZr8xo1Qmtqub+GA==\",\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"engines\": {\n        \"node\": \"^18 || ^20 || >= 21\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/node-devicectl\": {\n      \"version\": \"1.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/node-devicectl/-/node-devicectl-1.2.0.tgz\",\n      \"integrity\": \"sha512-9ZHN1eQGdZu38+/3z4mVxxqr1Ah1kX8FFYxvCLx38HRI+eDd13ut+Z8YDiodtkVJLqwiFpqgio/b2cjGJDQJzQ==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"@appium/logger\": \"^2.0.0-rc.1\",\n        \"lodash\": \"^4.2.1\",\n        \"teen_process\": \"^4.1.0\"\n      },\n      \"engines\": {\n        \"node\": \"^20.19.0 || ^22.12.0 || >=24.0.0\",\n        \"npm\": \">=10\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/node-simctl\": {\n      \"version\": \"8.1.6\",\n      \"resolved\": \"https://registry.npmjs.org/node-simctl/-/node-simctl-8.1.6.tgz\",\n      \"integrity\": \"sha512-SSwNzq4Tl575EaVFCIotDvDDV5XYR7676aN78lv/fhdxOQ+ZM6QZdIa/ZTXiDMc/Jd3wQ4L24E0d4Cqb6jy+Ew==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"@appium/logger\": \"^2.0.0-rc.1\",\n        \"asyncbox\": \"^6.0.1\",\n        \"bluebird\": \"^3.5.1\",\n        \"lodash\": \"^4.2.1\",\n        \"rimraf\": \"^6.0.1\",\n        \"semver\": \"^7.0.0\",\n        \"teen_process\": \"^4.0.4\",\n        \"uuid\": \"^13.0.0\",\n        \"which\": \"^6.0.0\"\n      },\n      \"engines\": {\n        \"node\": \"^20.19.0 || ^22.12.0 || >=24.0.0\",\n        \"npm\": \">=10\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/normalize-package-data\": {\n      \"version\": \"8.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-8.0.0.tgz\",\n      \"integrity\": \"sha512-RWk+PI433eESQ7ounYxIp67CYuVsS1uYSonX3kA6ps/3LWfjVQa/ptEg6Y3T6uAMq1mWpX9PQ+qx+QaHpsc7gQ==\",\n      \"license\": \"BSD-2-Clause\",\n      \"dependencies\": {\n        \"hosted-git-info\": \"^9.0.0\",\n        \"semver\": \"^7.3.5\",\n        \"validate-npm-package-license\": \"^3.0.4\"\n      },\n      \"engines\": {\n        \"node\": \"^20.17.0 || >=22.9.0\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/normalize-path\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz\",\n      \"integrity\": \"sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/npm-normalize-package-bin\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-4.0.0.tgz\",\n      \"integrity\": \"sha512-TZKxPvItzai9kN9H/TkmCtx/ZN/hvr3vUycjlfmH0ootY9yFBzNOpiXAdIn1Iteqsvk4lQn6B5PTrt+n6h8k/w==\",\n      \"license\": \"ISC\",\n      \"optional\": true,\n      \"engines\": {\n        \"node\": \"^18.17.0 || >=20.5.0\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/npm-run-all2\": {\n      \"version\": \"8.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/npm-run-all2/-/npm-run-all2-8.0.4.tgz\",\n      \"integrity\": \"sha512-wdbB5My48XKp2ZfJUlhnLVihzeuA1hgBnqB2J9ahV77wLS+/YAJAlN8I+X3DIFIPZ3m5L7nplmlbhNiFDmXRDA==\",\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"dependencies\": {\n        \"ansi-styles\": \"^6.2.1\",\n        \"cross-spawn\": \"^7.0.6\",\n        \"memorystream\": \"^0.3.1\",\n        \"picomatch\": \"^4.0.2\",\n        \"pidtree\": \"^0.6.0\",\n        \"read-package-json-fast\": \"^4.0.0\",\n        \"shell-quote\": \"^1.7.3\",\n        \"which\": \"^5.0.0\"\n      },\n      \"bin\": {\n        \"npm-run-all\": \"bin/npm-run-all/index.js\",\n        \"npm-run-all2\": \"bin/npm-run-all/index.js\",\n        \"run-p\": \"bin/run-p/index.js\",\n        \"run-s\": \"bin/run-s/index.js\"\n      },\n      \"engines\": {\n        \"node\": \"^20.5.0 || >=22.0.0\",\n        \"npm\": \">= 10\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/npm-run-all2/node_modules/ansi-styles\": {\n      \"version\": \"6.2.3\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz\",\n      \"integrity\": \"sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==\",\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/ansi-styles?sponsor=1\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/npm-run-all2/node_modules/isexe\": {\n      \"version\": \"3.1.5\",\n      \"resolved\": \"https://registry.npmjs.org/isexe/-/isexe-3.1.5.tgz\",\n      \"integrity\": \"sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==\",\n      \"license\": \"BlueOak-1.0.0\",\n      \"optional\": true,\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/npm-run-all2/node_modules/which\": {\n      \"version\": \"5.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/which/-/which-5.0.0.tgz\",\n      \"integrity\": \"sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==\",\n      \"license\": \"ISC\",\n      \"optional\": true,\n      \"dependencies\": {\n        \"isexe\": \"^3.1.1\"\n      },\n      \"bin\": {\n        \"node-which\": \"bin/which.js\"\n      },\n      \"engines\": {\n        \"node\": \"^18.17.0 || >=20.5.0\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/object-inspect\": {\n      \"version\": \"1.13.4\",\n      \"resolved\": \"https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz\",\n      \"integrity\": \"sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/obuf\": {\n      \"version\": \"1.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz\",\n      \"integrity\": \"sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==\",\n      \"license\": \"MIT\",\n      \"optional\": true\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/on-finished\": {\n      \"version\": \"2.4.1\",\n      \"resolved\": \"https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz\",\n      \"integrity\": \"sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"ee-first\": \"1.1.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/on-headers\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz\",\n      \"integrity\": \"sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/once\": {\n      \"version\": \"1.4.0\",\n      \"resolved\": \"https://registry.npmjs.org/once/-/once-1.4.0.tgz\",\n      \"integrity\": \"sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==\",\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"wrappy\": \"1\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/one-time\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz\",\n      \"integrity\": \"sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"fn.name\": \"1.x.x\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/p-limit\": {\n      \"version\": \"7.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/p-limit/-/p-limit-7.3.0.tgz\",\n      \"integrity\": \"sha512-7cIXg/Z0M5WZRblrsOla88S4wAK+zOQQWeBYfV3qJuJXMr+LnbYjaadrFaS0JILfEDPVqHyKnZ1Z/1d6J9VVUw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"yocto-queue\": \"^1.2.1\"\n      },\n      \"engines\": {\n        \"node\": \">=20\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/package-directory\": {\n      \"version\": \"8.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/package-directory/-/package-directory-8.2.0.tgz\",\n      \"integrity\": \"sha512-qJSu5Mo6tHmRxCy2KCYYKYgcfBdUpy9dwReaZD/xwf608AUk/MoRtIOWzgDtUeGeC7n/55yC3MI1Q+MbSoektw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"find-up-simple\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/package-json-from-dist\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz\",\n      \"integrity\": \"sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==\",\n      \"license\": \"BlueOak-1.0.0\"\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/parse-json\": {\n      \"version\": \"8.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/parse-json/-/parse-json-8.3.0.tgz\",\n      \"integrity\": \"sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@babel/code-frame\": \"^7.26.2\",\n        \"index-to-position\": \"^1.1.0\",\n        \"type-fest\": \"^4.39.1\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/parse-json/node_modules/type-fest\": {\n      \"version\": \"4.41.0\",\n      \"resolved\": \"https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz\",\n      \"integrity\": \"sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==\",\n      \"license\": \"(MIT OR CC0-1.0)\",\n      \"engines\": {\n        \"node\": \">=16\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/parse-listing\": {\n      \"version\": \"1.1.3\",\n      \"resolved\": \"https://registry.npmjs.org/parse-listing/-/parse-listing-1.1.3.tgz\",\n      \"integrity\": \"sha512-a1p1i+9Qyc8pJNwdrSvW1g5TPxRH0sywVi6OzVvYHRo6xwF9bDWBxtH0KkxeOOvhUE8vAMtiSfsYQFOuK901eA==\",\n      \"engines\": {\n        \"node\": \">=0.6.21\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/parseurl\": {\n      \"version\": \"1.3.3\",\n      \"resolved\": \"https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz\",\n      \"integrity\": \"sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/path-key\": {\n      \"version\": \"3.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz\",\n      \"integrity\": \"sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/path-scurry\": {\n      \"version\": \"2.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz\",\n      \"integrity\": \"sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==\",\n      \"license\": \"BlueOak-1.0.0\",\n      \"dependencies\": {\n        \"lru-cache\": \"^11.0.0\",\n        \"minipass\": \"^7.1.2\"\n      },\n      \"engines\": {\n        \"node\": \"18 || 20 || >=22\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/path-to-regexp\": {\n      \"version\": \"8.4.2\",\n      \"resolved\": \"https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.4.2.tgz\",\n      \"integrity\": \"sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==\",\n      \"license\": \"MIT\",\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/express\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/pend\": {\n      \"version\": \"1.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/pend/-/pend-1.2.0.tgz\",\n      \"integrity\": \"sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/picocolors\": {\n      \"version\": \"1.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz\",\n      \"integrity\": \"sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==\",\n      \"license\": \"ISC\"\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/picomatch\": {\n      \"version\": \"4.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz\",\n      \"integrity\": \"sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==\",\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/jonschlinkert\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/pidtree\": {\n      \"version\": \"0.6.0\",\n      \"resolved\": \"https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz\",\n      \"integrity\": \"sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==\",\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"bin\": {\n        \"pidtree\": \"bin/pidtree.js\"\n      },\n      \"engines\": {\n        \"node\": \">=0.10\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/plist\": {\n      \"version\": \"3.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/plist/-/plist-3.1.0.tgz\",\n      \"integrity\": \"sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@xmldom/xmldom\": \"^0.8.8\",\n        \"base64-js\": \"^1.5.1\",\n        \"xmlbuilder\": \"^15.1.1\"\n      },\n      \"engines\": {\n        \"node\": \">=10.4.0\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/plist/node_modules/@xmldom/xmldom\": {\n      \"version\": \"0.8.12\",\n      \"resolved\": \"https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.12.tgz\",\n      \"integrity\": \"sha512-9k/gHF6n/pAi/9tqr3m3aqkuiNosYTurLLUtc7xQ9sxB/wm7WPygCv8GYa6mS0fLJEHhqMC1ATYhz++U/lRHqg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=10.0.0\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/pluralize\": {\n      \"version\": \"8.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz\",\n      \"integrity\": \"sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/portscanner\": {\n      \"version\": \"2.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/portscanner/-/portscanner-2.2.0.tgz\",\n      \"integrity\": \"sha512-IFroCz/59Lqa2uBvzK3bKDbDDIEaAY8XJ1jFxcLWTqosrsc32//P4VuSB2vZXoHiHqOmx8B5L5hnKOxL/7FlPw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"async\": \"^2.6.0\",\n        \"is-number-like\": \"^1.0.3\"\n      },\n      \"engines\": {\n        \"node\": \">=0.4\",\n        \"npm\": \">=1.0.0\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/portscanner/node_modules/async\": {\n      \"version\": \"2.6.4\",\n      \"resolved\": \"https://registry.npmjs.org/async/-/async-2.6.4.tgz\",\n      \"integrity\": \"sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"lodash\": \"^4.17.14\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/process\": {\n      \"version\": \"0.11.10\",\n      \"resolved\": \"https://registry.npmjs.org/process/-/process-0.11.10.tgz\",\n      \"integrity\": \"sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.6.0\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/process-nextick-args\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz\",\n      \"integrity\": \"sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/proxy-addr\": {\n      \"version\": \"2.0.7\",\n      \"resolved\": \"https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz\",\n      \"integrity\": \"sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"forwarded\": \"0.2.0\",\n        \"ipaddr.js\": \"1.9.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.10\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/proxy-from-env\": {\n      \"version\": \"2.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz\",\n      \"integrity\": \"sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/qs\": {\n      \"version\": \"6.15.1\",\n      \"resolved\": \"https://registry.npmjs.org/qs/-/qs-6.15.1.tgz\",\n      \"integrity\": \"sha512-6YHEFRL9mfgcAvql/XhwTvf5jKcOiiupt2FiJxHkiX1z4j7WL8J/jRHYLluORvc1XxB5rV20KoeK00gVJamspg==\",\n      \"license\": \"BSD-3-Clause\",\n      \"dependencies\": {\n        \"side-channel\": \"^1.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">=0.6\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/range-parser\": {\n      \"version\": \"1.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz\",\n      \"integrity\": \"sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.6\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/raw-body\": {\n      \"version\": \"3.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz\",\n      \"integrity\": \"sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"bytes\": \"~3.1.2\",\n        \"http-errors\": \"~2.0.1\",\n        \"iconv-lite\": \"~0.7.0\",\n        \"unpipe\": \"~1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.10\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/read-package-json-fast\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-4.0.0.tgz\",\n      \"integrity\": \"sha512-qpt8EwugBWDw2cgE2W+/3oxC+KTez2uSVR8JU9Q36TXPAGCaozfQUs59v4j4GFpWTaw0i6hAZSvOmu1J0uOEUg==\",\n      \"license\": \"ISC\",\n      \"optional\": true,\n      \"dependencies\": {\n        \"json-parse-even-better-errors\": \"^4.0.0\",\n        \"npm-normalize-package-bin\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \"^18.17.0 || >=20.5.0\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/read-pkg\": {\n      \"version\": \"10.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/read-pkg/-/read-pkg-10.1.0.tgz\",\n      \"integrity\": \"sha512-I8g2lArQiP78ll51UeMZojewtYgIRCKCWqZEgOO8c/uefTI+XDXvCSXu3+YNUaTNvZzobrL5+SqHjBrByRRTdg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@types/normalize-package-data\": \"^2.4.4\",\n        \"normalize-package-data\": \"^8.0.0\",\n        \"parse-json\": \"^8.3.0\",\n        \"type-fest\": \"^5.4.4\",\n        \"unicorn-magic\": \"^0.4.0\"\n      },\n      \"engines\": {\n        \"node\": \">=20\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/readable-stream\": {\n      \"version\": \"4.7.0\",\n      \"resolved\": \"https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz\",\n      \"integrity\": \"sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"abort-controller\": \"^3.0.0\",\n        \"buffer\": \"^6.0.3\",\n        \"events\": \"^3.3.0\",\n        \"process\": \"^0.11.10\",\n        \"string_decoder\": \"^1.3.0\"\n      },\n      \"engines\": {\n        \"node\": \"^12.22.0 || ^14.17.0 || >=16.0.0\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/readable-stream/node_modules/buffer\": {\n      \"version\": \"6.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz\",\n      \"integrity\": \"sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==\",\n      \"funding\": [\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/feross\"\n        },\n        {\n          \"type\": \"patreon\",\n          \"url\": \"https://www.patreon.com/feross\"\n        },\n        {\n          \"type\": \"consulting\",\n          \"url\": \"https://feross.org/support\"\n        }\n      ],\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"base64-js\": \"^1.3.1\",\n        \"ieee754\": \"^1.2.1\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/readdir-glob\": {\n      \"version\": \"1.1.3\",\n      \"resolved\": \"https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz\",\n      \"integrity\": \"sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"minimatch\": \"^5.1.0\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/readdir-glob/node_modules/balanced-match\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz\",\n      \"integrity\": \"sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/readdir-glob/node_modules/brace-expansion\": {\n      \"version\": \"2.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz\",\n      \"integrity\": \"sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"balanced-match\": \"^1.0.0\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/readdir-glob/node_modules/minimatch\": {\n      \"version\": \"5.1.9\",\n      \"resolved\": \"https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz\",\n      \"integrity\": \"sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==\",\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"brace-expansion\": \"^2.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/resolve-from\": {\n      \"version\": \"5.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz\",\n      \"integrity\": \"sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/rimraf\": {\n      \"version\": \"6.1.3\",\n      \"resolved\": \"https://registry.npmjs.org/rimraf/-/rimraf-6.1.3.tgz\",\n      \"integrity\": \"sha512-LKg+Cr2ZF61fkcaK1UdkH2yEBBKnYjTyWzTJT6KNPcSPaiT7HSdhtMXQuN5wkTX0Xu72KQ1l8S42rlmexS2hSA==\",\n      \"license\": \"BlueOak-1.0.0\",\n      \"dependencies\": {\n        \"glob\": \"^13.0.3\",\n        \"package-json-from-dist\": \"^1.0.1\"\n      },\n      \"bin\": {\n        \"rimraf\": \"dist/esm/bin.mjs\"\n      },\n      \"engines\": {\n        \"node\": \"20 || >=22\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/router\": {\n      \"version\": \"2.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/router/-/router-2.2.0.tgz\",\n      \"integrity\": \"sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"debug\": \"^4.4.0\",\n        \"depd\": \"^2.0.0\",\n        \"is-promise\": \"^4.0.0\",\n        \"parseurl\": \"^1.3.3\",\n        \"path-to-regexp\": \"^8.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 18\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/safe-buffer\": {\n      \"version\": \"5.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz\",\n      \"integrity\": \"sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/safe-stable-stringify\": {\n      \"version\": \"2.5.0\",\n      \"resolved\": \"https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz\",\n      \"integrity\": \"sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/safer-buffer\": {\n      \"version\": \"2.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz\",\n      \"integrity\": \"sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/sanitize-filename\": {\n      \"version\": \"1.6.4\",\n      \"resolved\": \"https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.4.tgz\",\n      \"integrity\": \"sha512-9ZyI08PsvdQl2r/bBIGubpVdR3RR9sY6RDiWFPreA21C/EFlQhmgo20UZlNjZMMZNubusLhAQozkA0Od5J21Eg==\",\n      \"license\": \"WTFPL OR ISC\",\n      \"dependencies\": {\n        \"truncate-utf8-bytes\": \"^1.0.0\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/select-hose\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz\",\n      \"integrity\": \"sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==\",\n      \"license\": \"MIT\",\n      \"optional\": true\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/semver\": {\n      \"version\": \"7.7.4\",\n      \"resolved\": \"https://registry.npmjs.org/semver/-/semver-7.7.4.tgz\",\n      \"integrity\": \"sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==\",\n      \"license\": \"ISC\",\n      \"bin\": {\n        \"semver\": \"bin/semver.js\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/send\": {\n      \"version\": \"1.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/send/-/send-1.2.1.tgz\",\n      \"integrity\": \"sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"debug\": \"^4.4.3\",\n        \"encodeurl\": \"^2.0.0\",\n        \"escape-html\": \"^1.0.3\",\n        \"etag\": \"^1.8.1\",\n        \"fresh\": \"^2.0.0\",\n        \"http-errors\": \"^2.0.1\",\n        \"mime-types\": \"^3.0.2\",\n        \"ms\": \"^2.1.3\",\n        \"on-finished\": \"^2.4.1\",\n        \"range-parser\": \"^1.2.1\",\n        \"statuses\": \"^2.0.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 18\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/express\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/serve-favicon\": {\n      \"version\": \"2.5.1\",\n      \"resolved\": \"https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.5.1.tgz\",\n      \"integrity\": \"sha512-JndLBslCLA/ebr7rS3d+/EKkzTsTi1jI2T9l+vHfAaGJ7A7NhtDpSZ0lx81HCNWnnE0yHncG+SSnVf9IMxOwXQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"etag\": \"~1.8.1\",\n        \"fresh\": \"~0.5.2\",\n        \"ms\": \"~2.1.3\",\n        \"parseurl\": \"~1.3.2\",\n        \"safe-buffer\": \"~5.2.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.8.0\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/serve-favicon/node_modules/fresh\": {\n      \"version\": \"0.5.2\",\n      \"resolved\": \"https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz\",\n      \"integrity\": \"sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.6\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/serve-favicon/node_modules/safe-buffer\": {\n      \"version\": \"5.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz\",\n      \"integrity\": \"sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==\",\n      \"funding\": [\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/feross\"\n        },\n        {\n          \"type\": \"patreon\",\n          \"url\": \"https://www.patreon.com/feross\"\n        },\n        {\n          \"type\": \"consulting\",\n          \"url\": \"https://feross.org/support\"\n        }\n      ],\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/serve-static\": {\n      \"version\": \"2.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz\",\n      \"integrity\": \"sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"encodeurl\": \"^2.0.0\",\n        \"escape-html\": \"^1.0.3\",\n        \"parseurl\": \"^1.3.3\",\n        \"send\": \"^1.2.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 18\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/express\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/set-blocking\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz\",\n      \"integrity\": \"sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==\",\n      \"license\": \"ISC\"\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/setprototypeof\": {\n      \"version\": \"1.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz\",\n      \"integrity\": \"sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==\",\n      \"license\": \"ISC\"\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/sharp\": {\n      \"version\": \"0.34.5\",\n      \"resolved\": \"https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz\",\n      \"integrity\": \"sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==\",\n      \"hasInstallScript\": true,\n      \"license\": \"Apache-2.0\",\n      \"optional\": true,\n      \"dependencies\": {\n        \"@img/colour\": \"^1.0.0\",\n        \"detect-libc\": \"^2.1.2\",\n        \"semver\": \"^7.7.3\"\n      },\n      \"engines\": {\n        \"node\": \"^18.17.0 || ^20.3.0 || >=21.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://opencollective.com/libvips\"\n      },\n      \"optionalDependencies\": {\n        \"@img/sharp-darwin-arm64\": \"0.34.5\",\n        \"@img/sharp-darwin-x64\": \"0.34.5\",\n        \"@img/sharp-libvips-darwin-arm64\": \"1.2.4\",\n        \"@img/sharp-libvips-darwin-x64\": \"1.2.4\",\n        \"@img/sharp-libvips-linux-arm\": \"1.2.4\",\n        \"@img/sharp-libvips-linux-arm64\": \"1.2.4\",\n        \"@img/sharp-libvips-linux-ppc64\": \"1.2.4\",\n        \"@img/sharp-libvips-linux-riscv64\": \"1.2.4\",\n        \"@img/sharp-libvips-linux-s390x\": \"1.2.4\",\n        \"@img/sharp-libvips-linux-x64\": \"1.2.4\",\n        \"@img/sharp-libvips-linuxmusl-arm64\": \"1.2.4\",\n        \"@img/sharp-libvips-linuxmusl-x64\": \"1.2.4\",\n        \"@img/sharp-linux-arm\": \"0.34.5\",\n        \"@img/sharp-linux-arm64\": \"0.34.5\",\n        \"@img/sharp-linux-ppc64\": \"0.34.5\",\n        \"@img/sharp-linux-riscv64\": \"0.34.5\",\n        \"@img/sharp-linux-s390x\": \"0.34.5\",\n        \"@img/sharp-linux-x64\": \"0.34.5\",\n        \"@img/sharp-linuxmusl-arm64\": \"0.34.5\",\n        \"@img/sharp-linuxmusl-x64\": \"0.34.5\",\n        \"@img/sharp-wasm32\": \"0.34.5\",\n        \"@img/sharp-win32-arm64\": \"0.34.5\",\n        \"@img/sharp-win32-ia32\": \"0.34.5\",\n        \"@img/sharp-win32-x64\": \"0.34.5\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/shebang-command\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz\",\n      \"integrity\": \"sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"shebang-regex\": \"^3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/shebang-regex\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz\",\n      \"integrity\": \"sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/shell-quote\": {\n      \"version\": \"1.8.3\",\n      \"resolved\": \"https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz\",\n      \"integrity\": \"sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/side-channel\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz\",\n      \"integrity\": \"sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"es-errors\": \"^1.3.0\",\n        \"object-inspect\": \"^1.13.3\",\n        \"side-channel-list\": \"^1.0.0\",\n        \"side-channel-map\": \"^1.0.1\",\n        \"side-channel-weakmap\": \"^1.0.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/side-channel-list\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz\",\n      \"integrity\": \"sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"es-errors\": \"^1.3.0\",\n        \"object-inspect\": \"^1.13.4\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/side-channel-map\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz\",\n      \"integrity\": \"sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"call-bound\": \"^1.0.2\",\n        \"es-errors\": \"^1.3.0\",\n        \"get-intrinsic\": \"^1.2.5\",\n        \"object-inspect\": \"^1.13.3\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/side-channel-weakmap\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz\",\n      \"integrity\": \"sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"call-bound\": \"^1.0.2\",\n        \"es-errors\": \"^1.3.0\",\n        \"get-intrinsic\": \"^1.2.5\",\n        \"object-inspect\": \"^1.13.3\",\n        \"side-channel-map\": \"^1.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/signal-exit\": {\n      \"version\": \"3.0.7\",\n      \"resolved\": \"https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz\",\n      \"integrity\": \"sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==\",\n      \"license\": \"ISC\"\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/slugify\": {\n      \"version\": \"1.6.9\",\n      \"resolved\": \"https://registry.npmjs.org/slugify/-/slugify-1.6.9.tgz\",\n      \"integrity\": \"sha512-vZ7rfeehZui7wQs438JXBckYLkIIdfHOXsaVEUMyS5fHo1483l1bMdo0EDSWYclY0yZKFOipDy4KHuKs6ssvdg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=8.0.0\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/spdx-correct\": {\n      \"version\": \"3.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz\",\n      \"integrity\": \"sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"spdx-expression-parse\": \"^3.0.0\",\n        \"spdx-license-ids\": \"^3.0.0\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/spdx-exceptions\": {\n      \"version\": \"2.5.0\",\n      \"resolved\": \"https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz\",\n      \"integrity\": \"sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==\",\n      \"license\": \"CC-BY-3.0\"\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/spdx-expression-parse\": {\n      \"version\": \"3.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz\",\n      \"integrity\": \"sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"spdx-exceptions\": \"^2.1.0\",\n        \"spdx-license-ids\": \"^3.0.0\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/spdx-license-ids\": {\n      \"version\": \"3.0.23\",\n      \"resolved\": \"https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz\",\n      \"integrity\": \"sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==\",\n      \"license\": \"CC0-1.0\"\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/spdy\": {\n      \"version\": \"4.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz\",\n      \"integrity\": \"sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==\",\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"dependencies\": {\n        \"debug\": \"^4.1.0\",\n        \"handle-thing\": \"^2.0.0\",\n        \"http-deceiver\": \"^1.2.7\",\n        \"select-hose\": \"^2.0.0\",\n        \"spdy-transport\": \"^3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6.0.0\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/spdy-transport\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz\",\n      \"integrity\": \"sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==\",\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"dependencies\": {\n        \"debug\": \"^4.1.0\",\n        \"detect-node\": \"^2.0.4\",\n        \"hpack.js\": \"^2.1.6\",\n        \"obuf\": \"^1.1.2\",\n        \"readable-stream\": \"^3.0.6\",\n        \"wbuf\": \"^1.7.3\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/spdy-transport/node_modules/readable-stream\": {\n      \"version\": \"3.6.2\",\n      \"resolved\": \"https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz\",\n      \"integrity\": \"sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==\",\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"dependencies\": {\n        \"inherits\": \"^2.0.3\",\n        \"string_decoder\": \"^1.1.1\",\n        \"util-deprecate\": \"^1.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 6\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/stack-trace\": {\n      \"version\": \"0.0.10\",\n      \"resolved\": \"https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz\",\n      \"integrity\": \"sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \"*\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/statuses\": {\n      \"version\": \"2.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz\",\n      \"integrity\": \"sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/stream-buffers\": {\n      \"version\": \"2.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz\",\n      \"integrity\": \"sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==\",\n      \"license\": \"Unlicense\",\n      \"engines\": {\n        \"node\": \">= 0.10.0\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/stream-combiner\": {\n      \"version\": \"0.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz\",\n      \"integrity\": \"sha512-6yHMqgLYDzQDcAkL+tjJDC5nSNuNIx0vZtRZeiPh7Saef7VHX9H5Ijn9l2VIol2zaNYlYEX6KyuT/237A58qEQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"duplexer\": \"~0.1.1\",\n        \"through\": \"~2.3.4\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/streamx\": {\n      \"version\": \"2.25.0\",\n      \"resolved\": \"https://registry.npmjs.org/streamx/-/streamx-2.25.0.tgz\",\n      \"integrity\": \"sha512-0nQuG6jf1w+wddNEEXCF4nTg3LtufWINB5eFEN+5TNZW7KWJp6x87+JFL43vaAUPyCfH1wID+mNVyW6OHtFamg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"events-universal\": \"^1.0.0\",\n        \"fast-fifo\": \"^1.3.2\",\n        \"text-decoder\": \"^1.1.0\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/string_decoder\": {\n      \"version\": \"1.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz\",\n      \"integrity\": \"sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"safe-buffer\": \"~5.2.0\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/string_decoder/node_modules/safe-buffer\": {\n      \"version\": \"5.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz\",\n      \"integrity\": \"sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==\",\n      \"funding\": [\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/feross\"\n        },\n        {\n          \"type\": \"patreon\",\n          \"url\": \"https://www.patreon.com/feross\"\n        },\n        {\n          \"type\": \"consulting\",\n          \"url\": \"https://feross.org/support\"\n        }\n      ],\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/string-width\": {\n      \"version\": \"4.2.3\",\n      \"resolved\": \"https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz\",\n      \"integrity\": \"sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"emoji-regex\": \"^8.0.0\",\n        \"is-fullwidth-code-point\": \"^3.0.0\",\n        \"strip-ansi\": \"^6.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/string-width-cjs\": {\n      \"name\": \"string-width\",\n      \"version\": \"4.2.3\",\n      \"resolved\": \"https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz\",\n      \"integrity\": \"sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"emoji-regex\": \"^8.0.0\",\n        \"is-fullwidth-code-point\": \"^3.0.0\",\n        \"strip-ansi\": \"^6.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/strip-ansi\": {\n      \"version\": \"6.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz\",\n      \"integrity\": \"sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"ansi-regex\": \"^5.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/strip-ansi-cjs\": {\n      \"name\": \"strip-ansi\",\n      \"version\": \"6.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz\",\n      \"integrity\": \"sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"ansi-regex\": \"^5.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/strip-ansi-cjs/node_modules/ansi-regex\": {\n      \"version\": \"5.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz\",\n      \"integrity\": \"sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/strip-ansi/node_modules/ansi-regex\": {\n      \"version\": \"5.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz\",\n      \"integrity\": \"sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/supports-color\": {\n      \"version\": \"10.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/supports-color/-/supports-color-10.2.2.tgz\",\n      \"integrity\": \"sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/supports-color?sponsor=1\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/tagged-tag\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz\",\n      \"integrity\": \"sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=20\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/tar-stream\": {\n      \"version\": \"3.1.8\",\n      \"resolved\": \"https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.8.tgz\",\n      \"integrity\": \"sha512-U6QpVRyCGHva435KoNWy9PRoi2IFYCgtEhq9nmrPPpbRacPs9IH4aJ3gbrFC8dPcXvdSZ4XXfXT5Fshbp2MtlQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"b4a\": \"^1.6.4\",\n        \"bare-fs\": \"^4.5.5\",\n        \"fast-fifo\": \"^1.2.0\",\n        \"streamx\": \"^2.15.0\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/teen_process\": {\n      \"version\": \"4.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/teen_process/-/teen_process-4.1.0.tgz\",\n      \"integrity\": \"sha512-AN8y3MYPExB3r2mkkX9r0wEF4xPfhKOj6YvcfeIqQai+GVhTIhjjdkPvwI5CFT4z8UQ5aZWldzbJ+jNejYAdGw==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"lodash\": \"^4.17.21\",\n        \"shell-quote\": \"^1.8.1\"\n      },\n      \"engines\": {\n        \"node\": \"^20.19.0 || ^22.12.0 || >=24.0.0\",\n        \"npm\": \">=10\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/teex\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/teex/-/teex-1.0.1.tgz\",\n      \"integrity\": \"sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"streamx\": \"^2.12.5\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/text-decoder\": {\n      \"version\": \"1.2.7\",\n      \"resolved\": \"https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.7.tgz\",\n      \"integrity\": \"sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"b4a\": \"^1.6.4\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/text-hex\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz\",\n      \"integrity\": \"sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/through\": {\n      \"version\": \"2.3.8\",\n      \"resolved\": \"https://registry.npmjs.org/through/-/through-2.3.8.tgz\",\n      \"integrity\": \"sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/toidentifier\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz\",\n      \"integrity\": \"sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=0.6\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/triple-beam\": {\n      \"version\": \"1.4.1\",\n      \"resolved\": \"https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz\",\n      \"integrity\": \"sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 14.0.0\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/truncate-utf8-bytes\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz\",\n      \"integrity\": \"sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==\",\n      \"license\": \"WTFPL\",\n      \"dependencies\": {\n        \"utf8-byte-length\": \"^1.0.1\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/type-fest\": {\n      \"version\": \"5.5.0\",\n      \"resolved\": \"https://registry.npmjs.org/type-fest/-/type-fest-5.5.0.tgz\",\n      \"integrity\": \"sha512-PlBfpQwiUvGViBNX84Yxwjsdhd1TUlXr6zjX7eoirtCPIr08NAmxwa+fcYBTeRQxHo9YC9wwF3m9i700sHma8g==\",\n      \"license\": \"(MIT OR CC0-1.0)\",\n      \"dependencies\": {\n        \"tagged-tag\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=20\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/type-is\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz\",\n      \"integrity\": \"sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"content-type\": \"^1.0.5\",\n        \"media-typer\": \"^1.1.0\",\n        \"mime-types\": \"^3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.6\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/undici-types\": {\n      \"version\": \"7.19.2\",\n      \"resolved\": \"https://registry.npmjs.org/undici-types/-/undici-types-7.19.2.tgz\",\n      \"integrity\": \"sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==\",\n      \"license\": \"MIT\",\n      \"optional\": true\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/unicorn-magic\": {\n      \"version\": \"0.4.0\",\n      \"resolved\": \"https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.4.0.tgz\",\n      \"integrity\": \"sha512-wH590V9VNgYH9g3lH9wWjTrUoKsjLF6sGLjhR4sH1LWpLmCOH0Zf7PukhDA8BiS7KHe4oPNkcTHqYkj7SOGUOw==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=20\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/unorm\": {\n      \"version\": \"1.6.0\",\n      \"resolved\": \"https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz\",\n      \"integrity\": \"sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==\",\n      \"license\": \"MIT or GPL-2.0\",\n      \"engines\": {\n        \"node\": \">= 0.4.0\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/unpipe\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz\",\n      \"integrity\": \"sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/utf8-byte-length\": {\n      \"version\": \"1.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz\",\n      \"integrity\": \"sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==\",\n      \"license\": \"(WTFPL OR MIT)\"\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/util-deprecate\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz\",\n      \"integrity\": \"sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/uuid\": {\n      \"version\": \"13.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/uuid/-/uuid-13.0.0.tgz\",\n      \"integrity\": \"sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==\",\n      \"funding\": [\n        \"https://github.com/sponsors/broofa\",\n        \"https://github.com/sponsors/ctavan\"\n      ],\n      \"license\": \"MIT\",\n      \"bin\": {\n        \"uuid\": \"dist-node/bin/uuid\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/validate-npm-package-license\": {\n      \"version\": \"3.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz\",\n      \"integrity\": \"sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"spdx-correct\": \"^3.0.0\",\n        \"spdx-expression-parse\": \"^3.0.0\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/vary\": {\n      \"version\": \"1.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/vary/-/vary-1.1.2.tgz\",\n      \"integrity\": \"sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/wbuf\": {\n      \"version\": \"1.7.3\",\n      \"resolved\": \"https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz\",\n      \"integrity\": \"sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==\",\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"dependencies\": {\n        \"minimalistic-assert\": \"^1.0.0\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/which\": {\n      \"version\": \"6.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/which/-/which-6.0.1.tgz\",\n      \"integrity\": \"sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==\",\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"isexe\": \"^4.0.0\"\n      },\n      \"bin\": {\n        \"node-which\": \"bin/which.js\"\n      },\n      \"engines\": {\n        \"node\": \"^20.17.0 || >=22.9.0\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/winston\": {\n      \"version\": \"3.19.0\",\n      \"resolved\": \"https://registry.npmjs.org/winston/-/winston-3.19.0.tgz\",\n      \"integrity\": \"sha512-LZNJgPzfKR+/J3cHkxcpHKpKKvGfDZVPS4hfJCc4cCG0CgYzvlD6yE/S3CIL/Yt91ak327YCpiF/0MyeZHEHKA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@colors/colors\": \"^1.6.0\",\n        \"@dabh/diagnostics\": \"^2.0.8\",\n        \"async\": \"^3.2.3\",\n        \"is-stream\": \"^2.0.0\",\n        \"logform\": \"^2.7.0\",\n        \"one-time\": \"^1.0.0\",\n        \"readable-stream\": \"^3.4.0\",\n        \"safe-stable-stringify\": \"^2.3.1\",\n        \"stack-trace\": \"0.0.x\",\n        \"triple-beam\": \"^1.3.0\",\n        \"winston-transport\": \"^4.9.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 12.0.0\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/winston-transport\": {\n      \"version\": \"4.9.0\",\n      \"resolved\": \"https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz\",\n      \"integrity\": \"sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"logform\": \"^2.7.0\",\n        \"readable-stream\": \"^3.6.2\",\n        \"triple-beam\": \"^1.3.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 12.0.0\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/winston-transport/node_modules/readable-stream\": {\n      \"version\": \"3.6.2\",\n      \"resolved\": \"https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz\",\n      \"integrity\": \"sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"inherits\": \"^2.0.3\",\n        \"string_decoder\": \"^1.1.1\",\n        \"util-deprecate\": \"^1.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 6\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/winston/node_modules/readable-stream\": {\n      \"version\": \"3.6.2\",\n      \"resolved\": \"https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz\",\n      \"integrity\": \"sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"inherits\": \"^2.0.3\",\n        \"string_decoder\": \"^1.1.1\",\n        \"util-deprecate\": \"^1.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 6\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/wrap-ansi-cjs\": {\n      \"name\": \"wrap-ansi\",\n      \"version\": \"7.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz\",\n      \"integrity\": \"sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"ansi-styles\": \"^4.0.0\",\n        \"string-width\": \"^4.1.0\",\n        \"strip-ansi\": \"^6.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/wrap-ansi?sponsor=1\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/wrappy\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz\",\n      \"integrity\": \"sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==\",\n      \"license\": \"ISC\"\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/ws\": {\n      \"version\": \"8.20.0\",\n      \"resolved\": \"https://registry.npmjs.org/ws/-/ws-8.20.0.tgz\",\n      \"integrity\": \"sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=10.0.0\"\n      },\n      \"peerDependencies\": {\n        \"bufferutil\": \"^4.0.1\",\n        \"utf-8-validate\": \">=5.0.2\"\n      },\n      \"peerDependenciesMeta\": {\n        \"bufferutil\": {\n          \"optional\": true\n        },\n        \"utf-8-validate\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/xmlbuilder\": {\n      \"version\": \"15.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz\",\n      \"integrity\": \"sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=8.0\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/yauzl\": {\n      \"version\": \"3.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/yauzl/-/yauzl-3.3.0.tgz\",\n      \"integrity\": \"sha512-PtGEvEP30p7sbIBJKUBjUnqgTVOyMURc4dLo9iNyAJnNIEz9pm88cCXF21w94Kg3k6RXkeZh5DHOGS0qEONvNQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"buffer-crc32\": \"~0.2.3\",\n        \"pend\": \"~1.2.0\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/yauzl/node_modules/buffer-crc32\": {\n      \"version\": \"0.2.13\",\n      \"resolved\": \"https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz\",\n      \"integrity\": \"sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \"*\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/yocto-queue\": {\n      \"version\": \"1.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz\",\n      \"integrity\": \"sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=12.20\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/yoctocolors\": {\n      \"version\": \"2.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.2.tgz\",\n      \"integrity\": \"sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/appium-xcuitest-driver/node_modules/zip-stream\": {\n      \"version\": \"6.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/zip-stream/-/zip-stream-6.0.1.tgz\",\n      \"integrity\": \"sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"archiver-utils\": \"^5.0.0\",\n        \"compress-commons\": \"^6.0.2\",\n        \"readable-stream\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 14\"\n      }\n    },\n    \"node_modules/archiver\": {\n      \"version\": \"7.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/archiver/-/archiver-7.0.1.tgz\",\n      \"integrity\": \"sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"archiver-utils\": \"^5.0.2\",\n        \"async\": \"^3.2.4\",\n        \"buffer-crc32\": \"^1.0.0\",\n        \"readable-stream\": \"^4.0.0\",\n        \"readdir-glob\": \"^1.1.2\",\n        \"tar-stream\": \"^3.0.0\",\n        \"zip-stream\": \"^6.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 14\"\n      }\n    },\n    \"node_modules/archiver-utils\": {\n      \"version\": \"5.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/archiver-utils/-/archiver-utils-5.0.2.tgz\",\n      \"integrity\": \"sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"glob\": \"^10.0.0\",\n        \"graceful-fs\": \"^4.2.0\",\n        \"is-stream\": \"^2.0.1\",\n        \"lazystream\": \"^1.0.0\",\n        \"lodash\": \"^4.17.15\",\n        \"normalize-path\": \"^3.0.0\",\n        \"readable-stream\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 14\"\n      }\n    },\n    \"node_modules/archiver-utils/node_modules/brace-expansion\": {\n      \"version\": \"2.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz\",\n      \"integrity\": \"sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"balanced-match\": \"^1.0.0\"\n      }\n    },\n    \"node_modules/archiver-utils/node_modules/glob\": {\n      \"version\": \"10.5.0\",\n      \"resolved\": \"https://registry.npmjs.org/glob/-/glob-10.5.0.tgz\",\n      \"integrity\": \"sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==\",\n      \"deprecated\": \"Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me\",\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"foreground-child\": \"^3.1.0\",\n        \"jackspeak\": \"^3.1.2\",\n        \"minimatch\": \"^9.0.4\",\n        \"minipass\": \"^7.1.2\",\n        \"package-json-from-dist\": \"^1.0.0\",\n        \"path-scurry\": \"^1.11.1\"\n      },\n      \"bin\": {\n        \"glob\": \"dist/esm/bin.mjs\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/archiver-utils/node_modules/lru-cache\": {\n      \"version\": \"10.4.3\",\n      \"resolved\": \"https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz\",\n      \"integrity\": \"sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==\",\n      \"license\": \"ISC\"\n    },\n    \"node_modules/archiver-utils/node_modules/minimatch\": {\n      \"version\": \"9.0.9\",\n      \"resolved\": \"https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz\",\n      \"integrity\": \"sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==\",\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"brace-expansion\": \"^2.0.2\"\n      },\n      \"engines\": {\n        \"node\": \">=16 || 14 >=14.17\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/archiver-utils/node_modules/path-scurry\": {\n      \"version\": \"1.11.1\",\n      \"resolved\": \"https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz\",\n      \"integrity\": \"sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==\",\n      \"license\": \"BlueOak-1.0.0\",\n      \"dependencies\": {\n        \"lru-cache\": \"^10.2.0\",\n        \"minipass\": \"^5.0.0 || ^6.0.2 || ^7.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=16 || 14 >=14.18\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/argparse\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz\",\n      \"integrity\": \"sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==\",\n      \"extraneous\": true,\n      \"license\": \"Python-2.0\"\n    },\n    \"node_modules/async\": {\n      \"version\": \"3.2.6\",\n      \"resolved\": \"https://registry.npmjs.org/async/-/async-3.2.6.tgz\",\n      \"integrity\": \"sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/async-lock\": {\n      \"version\": \"1.4.1\",\n      \"resolved\": \"https://registry.npmjs.org/async-lock/-/async-lock-1.4.1.tgz\",\n      \"integrity\": \"sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/asyncbox\": {\n      \"version\": \"6.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/asyncbox/-/asyncbox-6.1.0.tgz\",\n      \"integrity\": \"sha512-KZwKNVnDdDe0ubN+fFMuHhSljZNHnbjdJABImoqFzQP61oIg6sMlhXIqOIu3WRd7YwW89q+eVj2Ty/Ax5dbh2Q==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"p-limit\": \"^7.2.0\"\n      },\n      \"engines\": {\n        \"node\": \"^20.19.0 || ^22.12.0 || >=24.0.0\",\n        \"npm\": \">=10\"\n      }\n    },\n    \"node_modules/asynckit\": {\n      \"version\": \"0.4.0\",\n      \"resolved\": \"https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz\",\n      \"integrity\": \"sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/axios\": {\n      \"version\": \"1.15.0\",\n      \"resolved\": \"https://registry.npmjs.org/axios/-/axios-1.15.0.tgz\",\n      \"integrity\": \"sha512-wWyJDlAatxk30ZJer+GeCWS209sA42X+N5jU2jy6oHTp7ufw8uzUTVFBX9+wTfAlhiJXGS0Bq7X6efruWjuK9Q==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"follow-redirects\": \"^1.15.11\",\n        \"form-data\": \"^4.0.5\",\n        \"proxy-from-env\": \"^2.1.0\"\n      }\n    },\n    \"node_modules/b4a\": {\n      \"version\": \"1.8.0\",\n      \"resolved\": \"https://registry.npmjs.org/b4a/-/b4a-1.8.0.tgz\",\n      \"integrity\": \"sha512-qRuSmNSkGQaHwNbM7J78Wwy+ghLEYF1zNrSeMxj4Kgw6y33O3mXcQ6Ie9fRvfU/YnxWkOchPXbaLb73TkIsfdg==\",\n      \"license\": \"Apache-2.0\",\n      \"peerDependencies\": {\n        \"react-native-b4a\": \"*\"\n      },\n      \"peerDependenciesMeta\": {\n        \"react-native-b4a\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/balanced-match\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz\",\n      \"integrity\": \"sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/bare-events\": {\n      \"version\": \"2.8.2\",\n      \"resolved\": \"https://registry.npmjs.org/bare-events/-/bare-events-2.8.2.tgz\",\n      \"integrity\": \"sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==\",\n      \"license\": \"Apache-2.0\",\n      \"peerDependencies\": {\n        \"bare-abort-controller\": \"*\"\n      },\n      \"peerDependenciesMeta\": {\n        \"bare-abort-controller\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/bare-fs\": {\n      \"version\": \"4.7.0\",\n      \"resolved\": \"https://registry.npmjs.org/bare-fs/-/bare-fs-4.7.0.tgz\",\n      \"integrity\": \"sha512-xzqKsCFxAek9aezYhjJuJRXBIaYlg/0OGDTZp+T8eYmYMlm66cs6cYko02drIyjN2CBbi+I6L7YfXyqpqtKRXA==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"bare-events\": \"^2.5.4\",\n        \"bare-path\": \"^3.0.0\",\n        \"bare-stream\": \"^2.6.4\",\n        \"bare-url\": \"^2.2.2\",\n        \"fast-fifo\": \"^1.3.2\"\n      },\n      \"engines\": {\n        \"bare\": \">=1.16.0\"\n      },\n      \"peerDependencies\": {\n        \"bare-buffer\": \"*\"\n      },\n      \"peerDependenciesMeta\": {\n        \"bare-buffer\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/bare-os\": {\n      \"version\": \"3.8.7\",\n      \"resolved\": \"https://registry.npmjs.org/bare-os/-/bare-os-3.8.7.tgz\",\n      \"integrity\": \"sha512-G4Gr1UsGeEy2qtDTZwL7JFLo2wapUarz7iTMcYcMFdS89AIQuBoyjgXZz0Utv7uHs3xA9LckhVbeBi8lEQrC+w==\",\n      \"license\": \"Apache-2.0\",\n      \"engines\": {\n        \"bare\": \">=1.14.0\"\n      }\n    },\n    \"node_modules/bare-path\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz\",\n      \"integrity\": \"sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"bare-os\": \"^3.0.1\"\n      }\n    },\n    \"node_modules/bare-stream\": {\n      \"version\": \"2.13.0\",\n      \"resolved\": \"https://registry.npmjs.org/bare-stream/-/bare-stream-2.13.0.tgz\",\n      \"integrity\": \"sha512-3zAJRZMDFGjdn+RVnNpF9kuELw+0Fl3lpndM4NcEOhb9zwtSo/deETfuIwMSE5BXanA0FrN1qVjffGwAg2Y7EA==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"streamx\": \"^2.25.0\",\n        \"teex\": \"^1.0.1\"\n      },\n      \"peerDependencies\": {\n        \"bare-abort-controller\": \"*\",\n        \"bare-buffer\": \"*\",\n        \"bare-events\": \"*\"\n      },\n      \"peerDependenciesMeta\": {\n        \"bare-abort-controller\": {\n          \"optional\": true\n        },\n        \"bare-buffer\": {\n          \"optional\": true\n        },\n        \"bare-events\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/bare-url\": {\n      \"version\": \"2.4.0\",\n      \"resolved\": \"https://registry.npmjs.org/bare-url/-/bare-url-2.4.0.tgz\",\n      \"integrity\": \"sha512-NSTU5WN+fy/L0DDenfE8SXQna4voXuW0FHM7wH8i3/q9khUSchfPbPezO4zSFMnDGIf9YE+mt/RWhZgNRKRIXA==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"bare-path\": \"^3.0.0\"\n      }\n    },\n    \"node_modules/base64-js\": {\n      \"version\": \"1.5.1\",\n      \"resolved\": \"https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz\",\n      \"integrity\": \"sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==\",\n      \"funding\": [\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/feross\"\n        },\n        {\n          \"type\": \"patreon\",\n          \"url\": \"https://www.patreon.com/feross\"\n        },\n        {\n          \"type\": \"consulting\",\n          \"url\": \"https://feross.org/support\"\n        }\n      ],\n      \"license\": \"MIT\"\n    },\n    \"node_modules/base64-stream\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/base64-stream/-/base64-stream-1.0.0.tgz\",\n      \"integrity\": \"sha512-BQQZftaO48FcE1Kof9CmXMFaAdqkcNorgc8CxesZv9nMbbTF1EFyQe89UOuh//QMmdtfUDXyO8rgUalemL5ODA==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/basic-auth\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz\",\n      \"integrity\": \"sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"safe-buffer\": \"5.1.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      }\n    },\n    \"node_modules/big-integer\": {\n      \"version\": \"1.6.52\",\n      \"resolved\": \"https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz\",\n      \"integrity\": \"sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==\",\n      \"license\": \"Unlicense\",\n      \"engines\": {\n        \"node\": \">=0.6\"\n      }\n    },\n    \"node_modules/bluebird\": {\n      \"version\": \"3.7.2\",\n      \"resolved\": \"https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz\",\n      \"integrity\": \"sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/body-parser\": {\n      \"version\": \"2.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz\",\n      \"integrity\": \"sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"bytes\": \"^3.1.2\",\n        \"content-type\": \"^1.0.5\",\n        \"debug\": \"^4.4.3\",\n        \"http-errors\": \"^2.0.0\",\n        \"iconv-lite\": \"^0.7.0\",\n        \"on-finished\": \"^2.4.1\",\n        \"qs\": \"^6.14.1\",\n        \"raw-body\": \"^3.0.1\",\n        \"type-is\": \"^2.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/express\"\n      }\n    },\n    \"node_modules/bplist-creator\": {\n      \"version\": \"0.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.1.1.tgz\",\n      \"integrity\": \"sha512-Ese7052fdWrxp/vqSJkydgx/1MdBnNOCV2XVfbmdGWD2H6EYza+Q4pyYSuVSnCUD22hfI/BFI4jHaC3NLXLlJQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"stream-buffers\": \"2.2.x\"\n      }\n    },\n    \"node_modules/bplist-parser\": {\n      \"version\": \"0.3.2\",\n      \"resolved\": \"https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz\",\n      \"integrity\": \"sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"big-integer\": \"1.6.x\"\n      },\n      \"engines\": {\n        \"node\": \">= 5.10.0\"\n      }\n    },\n    \"node_modules/buffer-crc32\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz\",\n      \"integrity\": \"sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=8.0.0\"\n      }\n    },\n    \"node_modules/bufferutil\": {\n      \"version\": \"4.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/bufferutil/-/bufferutil-4.1.0.tgz\",\n      \"integrity\": \"sha512-ZMANVnAixE6AWWnPzlW2KpUrxhm9woycYvPOo67jWHyFowASTEd9s+QN1EIMsSDtwhIxN4sWE1jotpuDUIgyIw==\",\n      \"hasInstallScript\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"dependencies\": {\n        \"node-gyp-build\": \"^4.3.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6.14.2\"\n      }\n    },\n    \"node_modules/bytes\": {\n      \"version\": \"3.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz\",\n      \"integrity\": \"sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      }\n    },\n    \"node_modules/call-bind-apply-helpers\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz\",\n      \"integrity\": \"sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"es-errors\": \"^1.3.0\",\n        \"function-bind\": \"^1.1.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/call-bound\": {\n      \"version\": \"1.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz\",\n      \"integrity\": \"sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"call-bind-apply-helpers\": \"^1.0.2\",\n        \"get-intrinsic\": \"^1.3.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/chalk\": {\n      \"version\": \"4.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz\",\n      \"integrity\": \"sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==\",\n      \"extraneous\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"ansi-styles\": \"^4.1.0\",\n        \"supports-color\": \"^7.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/chalk?sponsor=1\"\n      }\n    },\n    \"node_modules/chalk/node_modules/supports-color\": {\n      \"version\": \"7.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz\",\n      \"integrity\": \"sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==\",\n      \"extraneous\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"has-flag\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/cliui\": {\n      \"version\": \"9.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz\",\n      \"integrity\": \"sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==\",\n      \"extraneous\": true,\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"string-width\": \"^7.2.0\",\n        \"strip-ansi\": \"^7.1.0\",\n        \"wrap-ansi\": \"^9.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=20\"\n      }\n    },\n    \"node_modules/cliui/node_modules/emoji-regex\": {\n      \"version\": \"10.6.0\",\n      \"resolved\": \"https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz\",\n      \"integrity\": \"sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==\",\n      \"extraneous\": true,\n      \"license\": \"MIT\"\n    },\n    \"node_modules/cliui/node_modules/string-width\": {\n      \"version\": \"7.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz\",\n      \"integrity\": \"sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==\",\n      \"extraneous\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"emoji-regex\": \"^10.3.0\",\n        \"get-east-asian-width\": \"^1.0.0\",\n        \"strip-ansi\": \"^7.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/cliui/node_modules/strip-ansi\": {\n      \"version\": \"7.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz\",\n      \"integrity\": \"sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==\",\n      \"extraneous\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"ansi-regex\": \"^6.2.2\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/strip-ansi?sponsor=1\"\n      }\n    },\n    \"node_modules/color-convert\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz\",\n      \"integrity\": \"sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"color-name\": \"~1.1.4\"\n      },\n      \"engines\": {\n        \"node\": \">=7.0.0\"\n      }\n    },\n    \"node_modules/color-name\": {\n      \"version\": \"1.1.4\",\n      \"resolved\": \"https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz\",\n      \"integrity\": \"sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/combined-stream\": {\n      \"version\": \"1.0.8\",\n      \"resolved\": \"https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz\",\n      \"integrity\": \"sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"delayed-stream\": \"~1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      }\n    },\n    \"node_modules/compare-versions\": {\n      \"version\": \"6.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.1.tgz\",\n      \"integrity\": \"sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/compress-commons\": {\n      \"version\": \"6.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.2.tgz\",\n      \"integrity\": \"sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"crc-32\": \"^1.2.0\",\n        \"crc32-stream\": \"^6.0.0\",\n        \"is-stream\": \"^2.0.1\",\n        \"normalize-path\": \"^3.0.0\",\n        \"readable-stream\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 14\"\n      }\n    },\n    \"node_modules/console-control-strings\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz\",\n      \"integrity\": \"sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==\",\n      \"license\": \"ISC\"\n    },\n    \"node_modules/content-disposition\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/content-disposition/-/content-disposition-1.1.0.tgz\",\n      \"integrity\": \"sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/express\"\n      }\n    },\n    \"node_modules/content-type\": {\n      \"version\": \"1.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz\",\n      \"integrity\": \"sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.6\"\n      }\n    },\n    \"node_modules/cookie\": {\n      \"version\": \"0.7.2\",\n      \"resolved\": \"https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz\",\n      \"integrity\": \"sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.6\"\n      }\n    },\n    \"node_modules/cookie-signature\": {\n      \"version\": \"1.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz\",\n      \"integrity\": \"sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=6.6.0\"\n      }\n    },\n    \"node_modules/core-util-is\": {\n      \"version\": \"1.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz\",\n      \"integrity\": \"sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/crc-32\": {\n      \"version\": \"1.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz\",\n      \"integrity\": \"sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==\",\n      \"license\": \"Apache-2.0\",\n      \"bin\": {\n        \"crc32\": \"bin/crc32.njs\"\n      },\n      \"engines\": {\n        \"node\": \">=0.8\"\n      }\n    },\n    \"node_modules/crc32-stream\": {\n      \"version\": \"6.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/crc32-stream/-/crc32-stream-6.0.0.tgz\",\n      \"integrity\": \"sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"crc-32\": \"^1.2.0\",\n        \"readable-stream\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 14\"\n      }\n    },\n    \"node_modules/cross-spawn\": {\n      \"version\": \"7.0.6\",\n      \"resolved\": \"https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz\",\n      \"integrity\": \"sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"path-key\": \"^3.1.0\",\n        \"shebang-command\": \"^2.0.0\",\n        \"which\": \"^2.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 8\"\n      }\n    },\n    \"node_modules/cross-spawn/node_modules/isexe\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz\",\n      \"integrity\": \"sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==\",\n      \"license\": \"ISC\"\n    },\n    \"node_modules/cross-spawn/node_modules/which\": {\n      \"version\": \"2.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/which/-/which-2.0.2.tgz\",\n      \"integrity\": \"sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==\",\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"isexe\": \"^2.0.0\"\n      },\n      \"bin\": {\n        \"node-which\": \"bin/node-which\"\n      },\n      \"engines\": {\n        \"node\": \">= 8\"\n      }\n    },\n    \"node_modules/debug\": {\n      \"version\": \"4.4.3\",\n      \"resolved\": \"https://registry.npmjs.org/debug/-/debug-4.4.3.tgz\",\n      \"integrity\": \"sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"ms\": \"^2.1.3\"\n      },\n      \"engines\": {\n        \"node\": \">=6.0\"\n      },\n      \"peerDependenciesMeta\": {\n        \"supports-color\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/delayed-stream\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz\",\n      \"integrity\": \"sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=0.4.0\"\n      }\n    },\n    \"node_modules/depd\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/depd/-/depd-2.0.0.tgz\",\n      \"integrity\": \"sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      }\n    },\n    \"node_modules/detect-libc\": {\n      \"version\": \"2.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz\",\n      \"integrity\": \"sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==\",\n      \"license\": \"Apache-2.0\",\n      \"optional\": true,\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/detect-node\": {\n      \"version\": \"2.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz\",\n      \"integrity\": \"sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==\",\n      \"license\": \"MIT\",\n      \"optional\": true\n    },\n    \"node_modules/dunder-proto\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz\",\n      \"integrity\": \"sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"call-bind-apply-helpers\": \"^1.0.1\",\n        \"es-errors\": \"^1.3.0\",\n        \"gopd\": \"^1.2.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/duplexer\": {\n      \"version\": \"0.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz\",\n      \"integrity\": \"sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/eastasianwidth\": {\n      \"version\": \"0.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz\",\n      \"integrity\": \"sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/ee-first\": {\n      \"version\": \"1.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz\",\n      \"integrity\": \"sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/emoji-regex\": {\n      \"version\": \"8.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz\",\n      \"integrity\": \"sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/encodeurl\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz\",\n      \"integrity\": \"sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      }\n    },\n    \"node_modules/es-define-property\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz\",\n      \"integrity\": \"sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/es-errors\": {\n      \"version\": \"1.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz\",\n      \"integrity\": \"sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/es-object-atoms\": {\n      \"version\": \"1.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz\",\n      \"integrity\": \"sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"es-errors\": \"^1.3.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/es-set-tostringtag\": {\n      \"version\": \"2.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz\",\n      \"integrity\": \"sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"es-errors\": \"^1.3.0\",\n        \"get-intrinsic\": \"^1.2.6\",\n        \"has-tostringtag\": \"^1.0.2\",\n        \"hasown\": \"^2.0.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/escalade\": {\n      \"version\": \"3.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz\",\n      \"integrity\": \"sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==\",\n      \"extraneous\": true,\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/escape-html\": {\n      \"version\": \"1.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz\",\n      \"integrity\": \"sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/etag\": {\n      \"version\": \"1.8.1\",\n      \"resolved\": \"https://registry.npmjs.org/etag/-/etag-1.8.1.tgz\",\n      \"integrity\": \"sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.6\"\n      }\n    },\n    \"node_modules/event-target-shim\": {\n      \"version\": \"5.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz\",\n      \"integrity\": \"sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/eventemitter3\": {\n      \"version\": \"5.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz\",\n      \"integrity\": \"sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/events\": {\n      \"version\": \"3.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/events/-/events-3.3.0.tgz\",\n      \"integrity\": \"sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=0.8.x\"\n      }\n    },\n    \"node_modules/events-universal\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz\",\n      \"integrity\": \"sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"bare-events\": \"^2.7.0\"\n      }\n    },\n    \"node_modules/express\": {\n      \"version\": \"5.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/express/-/express-5.2.1.tgz\",\n      \"integrity\": \"sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"accepts\": \"^2.0.0\",\n        \"body-parser\": \"^2.2.1\",\n        \"content-disposition\": \"^1.0.0\",\n        \"content-type\": \"^1.0.5\",\n        \"cookie\": \"^0.7.1\",\n        \"cookie-signature\": \"^1.2.1\",\n        \"debug\": \"^4.4.0\",\n        \"depd\": \"^2.0.0\",\n        \"encodeurl\": \"^2.0.0\",\n        \"escape-html\": \"^1.0.3\",\n        \"etag\": \"^1.8.1\",\n        \"finalhandler\": \"^2.1.0\",\n        \"fresh\": \"^2.0.0\",\n        \"http-errors\": \"^2.0.0\",\n        \"merge-descriptors\": \"^2.0.0\",\n        \"mime-types\": \"^3.0.0\",\n        \"on-finished\": \"^2.4.1\",\n        \"once\": \"^1.4.0\",\n        \"parseurl\": \"^1.3.3\",\n        \"proxy-addr\": \"^2.0.7\",\n        \"qs\": \"^6.14.0\",\n        \"range-parser\": \"^1.2.1\",\n        \"router\": \"^2.2.0\",\n        \"send\": \"^1.1.0\",\n        \"serve-static\": \"^2.2.0\",\n        \"statuses\": \"^2.0.1\",\n        \"type-is\": \"^2.0.1\",\n        \"vary\": \"^1.1.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 18\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/express\"\n      }\n    },\n    \"node_modules/fast-fifo\": {\n      \"version\": \"1.3.2\",\n      \"resolved\": \"https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz\",\n      \"integrity\": \"sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/fastest-levenshtein\": {\n      \"version\": \"1.0.16\",\n      \"resolved\": \"https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz\",\n      \"integrity\": \"sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 4.9.1\"\n      }\n    },\n    \"node_modules/finalhandler\": {\n      \"version\": \"2.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz\",\n      \"integrity\": \"sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"debug\": \"^4.4.0\",\n        \"encodeurl\": \"^2.0.0\",\n        \"escape-html\": \"^1.0.3\",\n        \"on-finished\": \"^2.4.1\",\n        \"parseurl\": \"^1.3.3\",\n        \"statuses\": \"^2.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 18.0.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/express\"\n      }\n    },\n    \"node_modules/find-up-simple\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.1.tgz\",\n      \"integrity\": \"sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/follow-redirects\": {\n      \"version\": \"1.15.11\",\n      \"resolved\": \"https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz\",\n      \"integrity\": \"sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==\",\n      \"funding\": [\n        {\n          \"type\": \"individual\",\n          \"url\": \"https://github.com/sponsors/RubenVerborgh\"\n        }\n      ],\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=4.0\"\n      },\n      \"peerDependenciesMeta\": {\n        \"debug\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/foreground-child\": {\n      \"version\": \"3.3.1\",\n      \"resolved\": \"https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz\",\n      \"integrity\": \"sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==\",\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"cross-spawn\": \"^7.0.6\",\n        \"signal-exit\": \"^4.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=14\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/foreground-child/node_modules/signal-exit\": {\n      \"version\": \"4.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz\",\n      \"integrity\": \"sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==\",\n      \"license\": \"ISC\",\n      \"engines\": {\n        \"node\": \">=14\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/form-data\": {\n      \"version\": \"4.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz\",\n      \"integrity\": \"sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"asynckit\": \"^0.4.0\",\n        \"combined-stream\": \"^1.0.8\",\n        \"es-set-tostringtag\": \"^2.1.0\",\n        \"hasown\": \"^2.0.2\",\n        \"mime-types\": \"^2.1.12\"\n      },\n      \"engines\": {\n        \"node\": \">= 6\"\n      }\n    },\n    \"node_modules/form-data/node_modules/mime-db\": {\n      \"version\": \"1.52.0\",\n      \"resolved\": \"https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz\",\n      \"integrity\": \"sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.6\"\n      }\n    },\n    \"node_modules/form-data/node_modules/mime-types\": {\n      \"version\": \"2.1.35\",\n      \"resolved\": \"https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz\",\n      \"integrity\": \"sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"mime-db\": \"1.52.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.6\"\n      }\n    },\n    \"node_modules/forwarded\": {\n      \"version\": \"0.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz\",\n      \"integrity\": \"sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.6\"\n      }\n    },\n    \"node_modules/fresh\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz\",\n      \"integrity\": \"sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      }\n    },\n    \"node_modules/ftp-response-parser\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/ftp-response-parser/-/ftp-response-parser-1.0.1.tgz\",\n      \"integrity\": \"sha512-++Ahlo2hs/IC7UVQzjcSAfeUpCwTTzs4uvG5XfGnsinIFkWUYF4xWwPd5qZuK8MJrmUIxFMuHcfqaosCDjvIWw==\",\n      \"dependencies\": {\n        \"readable-stream\": \"^1.0.31\"\n      },\n      \"engines\": {\n        \"node\": \">=0.8.0\"\n      }\n    },\n    \"node_modules/ftp-response-parser/node_modules/isarray\": {\n      \"version\": \"0.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz\",\n      \"integrity\": \"sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/ftp-response-parser/node_modules/readable-stream\": {\n      \"version\": \"1.1.14\",\n      \"resolved\": \"https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz\",\n      \"integrity\": \"sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"core-util-is\": \"~1.0.0\",\n        \"inherits\": \"~2.0.1\",\n        \"isarray\": \"0.0.1\",\n        \"string_decoder\": \"~0.10.x\"\n      }\n    },\n    \"node_modules/ftp-response-parser/node_modules/string_decoder\": {\n      \"version\": \"0.10.31\",\n      \"resolved\": \"https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz\",\n      \"integrity\": \"sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/function-bind\": {\n      \"version\": \"1.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz\",\n      \"integrity\": \"sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==\",\n      \"license\": \"MIT\",\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/get-caller-file\": {\n      \"version\": \"2.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz\",\n      \"integrity\": \"sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==\",\n      \"extraneous\": true,\n      \"license\": \"ISC\",\n      \"engines\": {\n        \"node\": \"6.* || 8.* || >= 10.*\"\n      }\n    },\n    \"node_modules/get-east-asian-width\": {\n      \"version\": \"1.5.0\",\n      \"resolved\": \"https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.5.0.tgz\",\n      \"integrity\": \"sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==\",\n      \"extraneous\": true,\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/get-intrinsic\": {\n      \"version\": \"1.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz\",\n      \"integrity\": \"sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"call-bind-apply-helpers\": \"^1.0.2\",\n        \"es-define-property\": \"^1.0.1\",\n        \"es-errors\": \"^1.3.0\",\n        \"es-object-atoms\": \"^1.1.1\",\n        \"function-bind\": \"^1.1.2\",\n        \"get-proto\": \"^1.0.1\",\n        \"gopd\": \"^1.2.0\",\n        \"has-symbols\": \"^1.1.0\",\n        \"hasown\": \"^2.0.2\",\n        \"math-intrinsics\": \"^1.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/get-proto\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz\",\n      \"integrity\": \"sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"dunder-proto\": \"^1.0.1\",\n        \"es-object-atoms\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/get-stream\": {\n      \"version\": \"9.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz\",\n      \"integrity\": \"sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@sec-ant/readable-stream\": \"^0.4.1\",\n        \"is-stream\": \"^4.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/get-stream/node_modules/is-stream\": {\n      \"version\": \"4.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz\",\n      \"integrity\": \"sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/glob\": {\n      \"version\": \"13.0.6\",\n      \"resolved\": \"https://registry.npmjs.org/glob/-/glob-13.0.6.tgz\",\n      \"integrity\": \"sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==\",\n      \"license\": \"BlueOak-1.0.0\",\n      \"dependencies\": {\n        \"minimatch\": \"^10.2.2\",\n        \"minipass\": \"^7.1.3\",\n        \"path-scurry\": \"^2.0.2\"\n      },\n      \"engines\": {\n        \"node\": \"18 || 20 || >=22\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/glob/node_modules/balanced-match\": {\n      \"version\": \"4.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz\",\n      \"integrity\": \"sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \"18 || 20 || >=22\"\n      }\n    },\n    \"node_modules/glob/node_modules/brace-expansion\": {\n      \"version\": \"5.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz\",\n      \"integrity\": \"sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"balanced-match\": \"^4.0.2\"\n      },\n      \"engines\": {\n        \"node\": \"18 || 20 || >=22\"\n      }\n    },\n    \"node_modules/glob/node_modules/minimatch\": {\n      \"version\": \"10.2.5\",\n      \"resolved\": \"https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz\",\n      \"integrity\": \"sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==\",\n      \"license\": \"BlueOak-1.0.0\",\n      \"dependencies\": {\n        \"brace-expansion\": \"^5.0.5\"\n      },\n      \"engines\": {\n        \"node\": \"18 || 20 || >=22\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/gopd\": {\n      \"version\": \"1.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz\",\n      \"integrity\": \"sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/graceful-fs\": {\n      \"version\": \"4.2.11\",\n      \"resolved\": \"https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz\",\n      \"integrity\": \"sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==\",\n      \"license\": \"ISC\"\n    },\n    \"node_modules/handle-thing\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz\",\n      \"integrity\": \"sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==\",\n      \"license\": \"MIT\",\n      \"optional\": true\n    },\n    \"node_modules/has-flag\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz\",\n      \"integrity\": \"sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==\",\n      \"extraneous\": true,\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/has-symbols\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz\",\n      \"integrity\": \"sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/has-tostringtag\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz\",\n      \"integrity\": \"sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"has-symbols\": \"^1.0.3\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/hasown\": {\n      \"version\": \"2.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz\",\n      \"integrity\": \"sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"function-bind\": \"^1.1.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/hosted-git-info\": {\n      \"version\": \"9.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-9.0.2.tgz\",\n      \"integrity\": \"sha512-M422h7o/BR3rmCQ8UHi7cyyMqKltdP9Uo+J2fXK+RSAY+wTcKOIRyhTuKv4qn+DJf3g+PL890AzId5KZpX+CBg==\",\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"lru-cache\": \"^11.1.0\"\n      },\n      \"engines\": {\n        \"node\": \"^20.17.0 || >=22.9.0\"\n      }\n    },\n    \"node_modules/hpack.js\": {\n      \"version\": \"2.1.6\",\n      \"resolved\": \"https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz\",\n      \"integrity\": \"sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==\",\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"dependencies\": {\n        \"inherits\": \"^2.0.1\",\n        \"obuf\": \"^1.0.0\",\n        \"readable-stream\": \"^2.0.1\",\n        \"wbuf\": \"^1.1.0\"\n      }\n    },\n    \"node_modules/hpack.js/node_modules/readable-stream\": {\n      \"version\": \"2.3.8\",\n      \"resolved\": \"https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz\",\n      \"integrity\": \"sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==\",\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"dependencies\": {\n        \"core-util-is\": \"~1.0.0\",\n        \"inherits\": \"~2.0.3\",\n        \"isarray\": \"~1.0.0\",\n        \"process-nextick-args\": \"~2.0.0\",\n        \"safe-buffer\": \"~5.1.1\",\n        \"string_decoder\": \"~1.1.1\",\n        \"util-deprecate\": \"~1.0.1\"\n      }\n    },\n    \"node_modules/hpack.js/node_modules/string_decoder\": {\n      \"version\": \"1.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz\",\n      \"integrity\": \"sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==\",\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"dependencies\": {\n        \"safe-buffer\": \"~5.1.0\"\n      }\n    },\n    \"node_modules/http-deceiver\": {\n      \"version\": \"1.2.7\",\n      \"resolved\": \"https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz\",\n      \"integrity\": \"sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==\",\n      \"license\": \"MIT\",\n      \"optional\": true\n    },\n    \"node_modules/http-errors\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz\",\n      \"integrity\": \"sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"depd\": \"~2.0.0\",\n        \"inherits\": \"~2.0.4\",\n        \"setprototypeof\": \"~1.2.0\",\n        \"statuses\": \"~2.0.2\",\n        \"toidentifier\": \"~1.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/express\"\n      }\n    },\n    \"node_modules/http-status-codes\": {\n      \"version\": \"2.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/http-status-codes/-/http-status-codes-2.3.0.tgz\",\n      \"integrity\": \"sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/iconv-lite\": {\n      \"version\": \"0.7.2\",\n      \"resolved\": \"https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz\",\n      \"integrity\": \"sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"safer-buffer\": \">= 2.1.2 < 3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/express\"\n      }\n    },\n    \"node_modules/ieee754\": {\n      \"version\": \"1.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz\",\n      \"integrity\": \"sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==\",\n      \"funding\": [\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/feross\"\n        },\n        {\n          \"type\": \"patreon\",\n          \"url\": \"https://www.patreon.com/feross\"\n        },\n        {\n          \"type\": \"consulting\",\n          \"url\": \"https://feross.org/support\"\n        }\n      ],\n      \"license\": \"BSD-3-Clause\"\n    },\n    \"node_modules/index-to-position\": {\n      \"version\": \"1.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/index-to-position/-/index-to-position-1.2.0.tgz\",\n      \"integrity\": \"sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/inherits\": {\n      \"version\": \"2.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz\",\n      \"integrity\": \"sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==\",\n      \"license\": \"ISC\"\n    },\n    \"node_modules/ini\": {\n      \"version\": \"6.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/ini/-/ini-6.0.0.tgz\",\n      \"integrity\": \"sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==\",\n      \"license\": \"ISC\",\n      \"engines\": {\n        \"node\": \"^20.17.0 || >=22.9.0\"\n      }\n    },\n    \"node_modules/io.appium.settings\": {\n      \"version\": \"7.0.22\",\n      \"resolved\": \"https://registry.npmjs.org/io.appium.settings/-/io.appium.settings-7.0.22.tgz\",\n      \"integrity\": \"sha512-LBKquRGIRfYG9qk8Y2CkOhuk4dDRSGNzcPoMy5a2/lopTpHPvJz+FQOXfcPVQ23qgbCE7GJH7chYKvlJrFOPZA==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"@appium/logger\": \"^2.0.0-rc.1\",\n        \"asyncbox\": \"^6.0.1\",\n        \"bluebird\": \"^3.5.1\",\n        \"lodash\": \"^4.2.1\",\n        \"semver\": \"^7.5.4\",\n        \"teen_process\": \"^4.0.4\"\n      },\n      \"engines\": {\n        \"node\": \"^20.19.0 || ^22.12.0 || >=24.0.0\",\n        \"npm\": \">=10\"\n      }\n    },\n    \"node_modules/ipaddr.js\": {\n      \"version\": \"1.9.1\",\n      \"resolved\": \"https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz\",\n      \"integrity\": \"sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.10\"\n      }\n    },\n    \"node_modules/is-fullwidth-code-point\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz\",\n      \"integrity\": \"sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/is-number-like\": {\n      \"version\": \"1.0.8\",\n      \"resolved\": \"https://registry.npmjs.org/is-number-like/-/is-number-like-1.0.8.tgz\",\n      \"integrity\": \"sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==\",\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"lodash.isfinite\": \"^3.3.2\"\n      }\n    },\n    \"node_modules/is-promise\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz\",\n      \"integrity\": \"sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/is-stream\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz\",\n      \"integrity\": \"sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=8\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/is-unicode-supported\": {\n      \"version\": \"2.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz\",\n      \"integrity\": \"sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/isarray\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz\",\n      \"integrity\": \"sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/isexe\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/isexe/-/isexe-4.0.0.tgz\",\n      \"integrity\": \"sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==\",\n      \"license\": \"BlueOak-1.0.0\",\n      \"engines\": {\n        \"node\": \">=20\"\n      }\n    },\n    \"node_modules/jackspeak\": {\n      \"version\": \"3.4.3\",\n      \"resolved\": \"https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz\",\n      \"integrity\": \"sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==\",\n      \"license\": \"BlueOak-1.0.0\",\n      \"dependencies\": {\n        \"@isaacs/cliui\": \"^8.0.2\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      },\n      \"optionalDependencies\": {\n        \"@pkgjs/parseargs\": \"^0.11.0\"\n      }\n    },\n    \"node_modules/js-tokens\": {\n      \"version\": \"4.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz\",\n      \"integrity\": \"sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/jsftp\": {\n      \"version\": \"2.1.3\",\n      \"resolved\": \"https://registry.npmjs.org/jsftp/-/jsftp-2.1.3.tgz\",\n      \"integrity\": \"sha512-r79EVB8jaNAZbq8hvanL8e8JGu2ZNr2bXdHC4ZdQhRImpSPpnWwm5DYVzQ5QxJmtGtKhNNuvqGgbNaFl604fEQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"debug\": \"^3.1.0\",\n        \"ftp-response-parser\": \"^1.0.1\",\n        \"once\": \"^1.4.0\",\n        \"parse-listing\": \"^1.1.3\",\n        \"stream-combiner\": \"^0.2.2\",\n        \"unorm\": \"^1.4.1\"\n      },\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/jsftp/node_modules/debug\": {\n      \"version\": \"3.2.7\",\n      \"resolved\": \"https://registry.npmjs.org/debug/-/debug-3.2.7.tgz\",\n      \"integrity\": \"sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"ms\": \"^2.1.1\"\n      }\n    },\n    \"node_modules/json-schema\": {\n      \"version\": \"0.4.0\",\n      \"resolved\": \"https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz\",\n      \"integrity\": \"sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==\",\n      \"license\": \"(AFL-2.1 OR BSD-3-Clause)\"\n    },\n    \"node_modules/klaw\": {\n      \"version\": \"4.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/klaw/-/klaw-4.1.0.tgz\",\n      \"integrity\": \"sha512-1zGZ9MF9H22UnkpVeuaGKOjfA2t6WrfdrJmGjy16ykcjnKQDmHVX+KI477rpbGevz/5FD4MC3xf1oxylBgcaQw==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=14.14.0\"\n      }\n    },\n    \"node_modules/lazystream\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz\",\n      \"integrity\": \"sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"readable-stream\": \"^2.0.5\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.6.3\"\n      }\n    },\n    \"node_modules/lazystream/node_modules/readable-stream\": {\n      \"version\": \"2.3.8\",\n      \"resolved\": \"https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz\",\n      \"integrity\": \"sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"core-util-is\": \"~1.0.0\",\n        \"inherits\": \"~2.0.3\",\n        \"isarray\": \"~1.0.0\",\n        \"process-nextick-args\": \"~2.0.0\",\n        \"safe-buffer\": \"~5.1.1\",\n        \"string_decoder\": \"~1.1.1\",\n        \"util-deprecate\": \"~1.0.1\"\n      }\n    },\n    \"node_modules/lazystream/node_modules/string_decoder\": {\n      \"version\": \"1.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz\",\n      \"integrity\": \"sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"safe-buffer\": \"~5.1.0\"\n      }\n    },\n    \"node_modules/lockfile\": {\n      \"version\": \"1.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/lockfile/-/lockfile-1.0.4.tgz\",\n      \"integrity\": \"sha512-cvbTwETRfsFh4nHsL1eGWapU1XFi5Ot9E85sWAwia7Y7EgB7vfqcZhTKZ+l7hCGxSPoushMv5GKhT5PdLv03WA==\",\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"signal-exit\": \"^3.0.2\"\n      }\n    },\n    \"node_modules/lodash\": {\n      \"version\": \"4.18.1\",\n      \"resolved\": \"https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz\",\n      \"integrity\": \"sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/lodash.isfinite\": {\n      \"version\": \"3.3.2\",\n      \"resolved\": \"https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz\",\n      \"integrity\": \"sha512-7FGG40uhC8Mm633uKW1r58aElFlBlxCrg9JfSi3P6aYiWmfiWF0PgMd86ZUsxE5GwWPdHoS2+48bwTh2VPkIQA==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/log-symbols\": {\n      \"version\": \"7.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/log-symbols/-/log-symbols-7.0.1.tgz\",\n      \"integrity\": \"sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"is-unicode-supported\": \"^2.0.0\",\n        \"yoctocolors\": \"^2.1.1\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/lru-cache\": {\n      \"version\": \"11.3.3\",\n      \"resolved\": \"https://registry.npmjs.org/lru-cache/-/lru-cache-11.3.3.tgz\",\n      \"integrity\": \"sha512-JvNw9Y81y33E+BEYPr0U7omo+U9AySnsMsEiXgwT6yqd31VQWTLNQqmT4ou5eqPFUrTfIDFta2wKhB1hyohtAQ==\",\n      \"license\": \"BlueOak-1.0.0\",\n      \"engines\": {\n        \"node\": \"20 || >=22\"\n      }\n    },\n    \"node_modules/math-intrinsics\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz\",\n      \"integrity\": \"sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      }\n    },\n    \"node_modules/media-typer\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz\",\n      \"integrity\": \"sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      }\n    },\n    \"node_modules/merge-descriptors\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz\",\n      \"integrity\": \"sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/method-override\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/method-override/-/method-override-3.0.0.tgz\",\n      \"integrity\": \"sha512-IJ2NNN/mSl9w3kzWB92rcdHpz+HjkxhDJWNDBqSlas+zQdP8wBiJzITPg08M/k2uVvMow7Sk41atndNtt/PHSA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"debug\": \"3.1.0\",\n        \"methods\": \"~1.1.2\",\n        \"parseurl\": \"~1.3.2\",\n        \"vary\": \"~1.1.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.10\"\n      }\n    },\n    \"node_modules/method-override/node_modules/debug\": {\n      \"version\": \"3.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/debug/-/debug-3.1.0.tgz\",\n      \"integrity\": \"sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"ms\": \"2.0.0\"\n      }\n    },\n    \"node_modules/method-override/node_modules/ms\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/ms/-/ms-2.0.0.tgz\",\n      \"integrity\": \"sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/methods\": {\n      \"version\": \"1.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/methods/-/methods-1.1.2.tgz\",\n      \"integrity\": \"sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.6\"\n      }\n    },\n    \"node_modules/mime-db\": {\n      \"version\": \"1.54.0\",\n      \"resolved\": \"https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz\",\n      \"integrity\": \"sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.6\"\n      }\n    },\n    \"node_modules/mime-types\": {\n      \"version\": \"3.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz\",\n      \"integrity\": \"sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"mime-db\": \"^1.54.0\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/express\"\n      }\n    },\n    \"node_modules/mimic-fn\": {\n      \"version\": \"2.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz\",\n      \"integrity\": \"sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==\",\n      \"extraneous\": true,\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=6\"\n      }\n    },\n    \"node_modules/minimalistic-assert\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz\",\n      \"integrity\": \"sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==\",\n      \"license\": \"ISC\",\n      \"optional\": true\n    },\n    \"node_modules/minipass\": {\n      \"version\": \"7.1.3\",\n      \"resolved\": \"https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz\",\n      \"integrity\": \"sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==\",\n      \"license\": \"BlueOak-1.0.0\",\n      \"engines\": {\n        \"node\": \">=16 || 14 >=14.17\"\n      }\n    },\n    \"node_modules/moment\": {\n      \"version\": \"2.30.1\",\n      \"resolved\": \"https://registry.npmjs.org/moment/-/moment-2.30.1.tgz\",\n      \"integrity\": \"sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \"*\"\n      }\n    },\n    \"node_modules/moment-timezone\": {\n      \"version\": \"0.6.1\",\n      \"resolved\": \"https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.6.1.tgz\",\n      \"integrity\": \"sha512-1B9lmAhB9D9/sHaPC1N7wLFEVUoFldxOpOO96lOD1PvJ43vCd0ozDPbu0FEL3++VvawOlDkq8YD373tJmP5JHw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"moment\": \"^2.29.4\"\n      },\n      \"engines\": {\n        \"node\": \"*\"\n      }\n    },\n    \"node_modules/morgan\": {\n      \"version\": \"1.10.1\",\n      \"resolved\": \"https://registry.npmjs.org/morgan/-/morgan-1.10.1.tgz\",\n      \"integrity\": \"sha512-223dMRJtI/l25dJKWpgij2cMtywuG/WiUKXdvwfbhGKBhy1puASqXwFzmWZ7+K73vUPoR7SS2Qz2cI/g9MKw0A==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"basic-auth\": \"~2.0.1\",\n        \"debug\": \"2.6.9\",\n        \"depd\": \"~2.0.0\",\n        \"on-finished\": \"~2.3.0\",\n        \"on-headers\": \"~1.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.8.0\"\n      }\n    },\n    \"node_modules/morgan/node_modules/debug\": {\n      \"version\": \"2.6.9\",\n      \"resolved\": \"https://registry.npmjs.org/debug/-/debug-2.6.9.tgz\",\n      \"integrity\": \"sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"ms\": \"2.0.0\"\n      }\n    },\n    \"node_modules/morgan/node_modules/ms\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/ms/-/ms-2.0.0.tgz\",\n      \"integrity\": \"sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/morgan/node_modules/on-finished\": {\n      \"version\": \"2.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz\",\n      \"integrity\": \"sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"ee-first\": \"1.1.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      }\n    },\n    \"node_modules/ms\": {\n      \"version\": \"2.1.3\",\n      \"resolved\": \"https://registry.npmjs.org/ms/-/ms-2.1.3.tgz\",\n      \"integrity\": \"sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/ncp\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz\",\n      \"integrity\": \"sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==\",\n      \"license\": \"MIT\",\n      \"bin\": {\n        \"ncp\": \"bin/ncp\"\n      }\n    },\n    \"node_modules/negotiator\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz\",\n      \"integrity\": \"sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.6\"\n      }\n    },\n    \"node_modules/node-gyp-build\": {\n      \"version\": \"4.8.4\",\n      \"resolved\": \"https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz\",\n      \"integrity\": \"sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==\",\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"bin\": {\n        \"node-gyp-build\": \"bin.js\",\n        \"node-gyp-build-optional\": \"optional.js\",\n        \"node-gyp-build-test\": \"build-test.js\"\n      }\n    },\n    \"node_modules/normalize-package-data\": {\n      \"version\": \"8.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-8.0.0.tgz\",\n      \"integrity\": \"sha512-RWk+PI433eESQ7ounYxIp67CYuVsS1uYSonX3kA6ps/3LWfjVQa/ptEg6Y3T6uAMq1mWpX9PQ+qx+QaHpsc7gQ==\",\n      \"license\": \"BSD-2-Clause\",\n      \"dependencies\": {\n        \"hosted-git-info\": \"^9.0.0\",\n        \"semver\": \"^7.3.5\",\n        \"validate-npm-package-license\": \"^3.0.4\"\n      },\n      \"engines\": {\n        \"node\": \"^20.17.0 || >=22.9.0\"\n      }\n    },\n    \"node_modules/normalize-path\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz\",\n      \"integrity\": \"sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/object-inspect\": {\n      \"version\": \"1.13.4\",\n      \"resolved\": \"https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz\",\n      \"integrity\": \"sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/obuf\": {\n      \"version\": \"1.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz\",\n      \"integrity\": \"sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==\",\n      \"license\": \"MIT\",\n      \"optional\": true\n    },\n    \"node_modules/on-finished\": {\n      \"version\": \"2.4.1\",\n      \"resolved\": \"https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz\",\n      \"integrity\": \"sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"ee-first\": \"1.1.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      }\n    },\n    \"node_modules/on-headers\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz\",\n      \"integrity\": \"sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      }\n    },\n    \"node_modules/once\": {\n      \"version\": \"1.4.0\",\n      \"resolved\": \"https://registry.npmjs.org/once/-/once-1.4.0.tgz\",\n      \"integrity\": \"sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==\",\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"wrappy\": \"1\"\n      }\n    },\n    \"node_modules/onetime\": {\n      \"version\": \"5.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz\",\n      \"integrity\": \"sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==\",\n      \"extraneous\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"mimic-fn\": \"^2.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/p-limit\": {\n      \"version\": \"7.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/p-limit/-/p-limit-7.3.0.tgz\",\n      \"integrity\": \"sha512-7cIXg/Z0M5WZRblrsOla88S4wAK+zOQQWeBYfV3qJuJXMr+LnbYjaadrFaS0JILfEDPVqHyKnZ1Z/1d6J9VVUw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"yocto-queue\": \"^1.2.1\"\n      },\n      \"engines\": {\n        \"node\": \">=20\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/package-directory\": {\n      \"version\": \"8.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/package-directory/-/package-directory-8.2.0.tgz\",\n      \"integrity\": \"sha512-qJSu5Mo6tHmRxCy2KCYYKYgcfBdUpy9dwReaZD/xwf608AUk/MoRtIOWzgDtUeGeC7n/55yC3MI1Q+MbSoektw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"find-up-simple\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/package-json-from-dist\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz\",\n      \"integrity\": \"sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==\",\n      \"license\": \"BlueOak-1.0.0\"\n    },\n    \"node_modules/parse-json\": {\n      \"version\": \"8.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/parse-json/-/parse-json-8.3.0.tgz\",\n      \"integrity\": \"sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@babel/code-frame\": \"^7.26.2\",\n        \"index-to-position\": \"^1.1.0\",\n        \"type-fest\": \"^4.39.1\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/parse-json/node_modules/type-fest\": {\n      \"version\": \"4.41.0\",\n      \"resolved\": \"https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz\",\n      \"integrity\": \"sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==\",\n      \"license\": \"(MIT OR CC0-1.0)\",\n      \"engines\": {\n        \"node\": \">=16\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/parse-listing\": {\n      \"version\": \"1.1.3\",\n      \"resolved\": \"https://registry.npmjs.org/parse-listing/-/parse-listing-1.1.3.tgz\",\n      \"integrity\": \"sha512-a1p1i+9Qyc8pJNwdrSvW1g5TPxRH0sywVi6OzVvYHRo6xwF9bDWBxtH0KkxeOOvhUE8vAMtiSfsYQFOuK901eA==\",\n      \"engines\": {\n        \"node\": \">=0.6.21\"\n      }\n    },\n    \"node_modules/parseurl\": {\n      \"version\": \"1.3.3\",\n      \"resolved\": \"https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz\",\n      \"integrity\": \"sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      }\n    },\n    \"node_modules/path-key\": {\n      \"version\": \"3.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz\",\n      \"integrity\": \"sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/path-scurry\": {\n      \"version\": \"2.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz\",\n      \"integrity\": \"sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==\",\n      \"license\": \"BlueOak-1.0.0\",\n      \"dependencies\": {\n        \"lru-cache\": \"^11.0.0\",\n        \"minipass\": \"^7.1.2\"\n      },\n      \"engines\": {\n        \"node\": \"18 || 20 || >=22\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/isaacs\"\n      }\n    },\n    \"node_modules/path-to-regexp\": {\n      \"version\": \"8.4.2\",\n      \"resolved\": \"https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.4.2.tgz\",\n      \"integrity\": \"sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==\",\n      \"license\": \"MIT\",\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/express\"\n      }\n    },\n    \"node_modules/pend\": {\n      \"version\": \"1.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/pend/-/pend-1.2.0.tgz\",\n      \"integrity\": \"sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/picocolors\": {\n      \"version\": \"1.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz\",\n      \"integrity\": \"sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==\",\n      \"license\": \"ISC\"\n    },\n    \"node_modules/plist\": {\n      \"version\": \"3.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/plist/-/plist-3.1.0.tgz\",\n      \"integrity\": \"sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@xmldom/xmldom\": \"^0.8.8\",\n        \"base64-js\": \"^1.5.1\",\n        \"xmlbuilder\": \"^15.1.1\"\n      },\n      \"engines\": {\n        \"node\": \">=10.4.0\"\n      }\n    },\n    \"node_modules/plist/node_modules/@xmldom/xmldom\": {\n      \"version\": \"0.8.12\",\n      \"resolved\": \"https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.12.tgz\",\n      \"integrity\": \"sha512-9k/gHF6n/pAi/9tqr3m3aqkuiNosYTurLLUtc7xQ9sxB/wm7WPygCv8GYa6mS0fLJEHhqMC1ATYhz++U/lRHqg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=10.0.0\"\n      }\n    },\n    \"node_modules/pluralize\": {\n      \"version\": \"8.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz\",\n      \"integrity\": \"sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=4\"\n      }\n    },\n    \"node_modules/portscanner\": {\n      \"version\": \"2.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/portscanner/-/portscanner-2.2.0.tgz\",\n      \"integrity\": \"sha512-IFroCz/59Lqa2uBvzK3bKDbDDIEaAY8XJ1jFxcLWTqosrsc32//P4VuSB2vZXoHiHqOmx8B5L5hnKOxL/7FlPw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"async\": \"^2.6.0\",\n        \"is-number-like\": \"^1.0.3\"\n      },\n      \"engines\": {\n        \"node\": \">=0.4\",\n        \"npm\": \">=1.0.0\"\n      }\n    },\n    \"node_modules/portscanner/node_modules/async\": {\n      \"version\": \"2.6.4\",\n      \"resolved\": \"https://registry.npmjs.org/async/-/async-2.6.4.tgz\",\n      \"integrity\": \"sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"lodash\": \"^4.17.14\"\n      }\n    },\n    \"node_modules/process\": {\n      \"version\": \"0.11.10\",\n      \"resolved\": \"https://registry.npmjs.org/process/-/process-0.11.10.tgz\",\n      \"integrity\": \"sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.6.0\"\n      }\n    },\n    \"node_modules/process-nextick-args\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz\",\n      \"integrity\": \"sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/proxy-addr\": {\n      \"version\": \"2.0.7\",\n      \"resolved\": \"https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz\",\n      \"integrity\": \"sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"forwarded\": \"0.2.0\",\n        \"ipaddr.js\": \"1.9.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.10\"\n      }\n    },\n    \"node_modules/proxy-from-env\": {\n      \"version\": \"2.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz\",\n      \"integrity\": \"sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/qs\": {\n      \"version\": \"6.15.1\",\n      \"resolved\": \"https://registry.npmjs.org/qs/-/qs-6.15.1.tgz\",\n      \"integrity\": \"sha512-6YHEFRL9mfgcAvql/XhwTvf5jKcOiiupt2FiJxHkiX1z4j7WL8J/jRHYLluORvc1XxB5rV20KoeK00gVJamspg==\",\n      \"license\": \"BSD-3-Clause\",\n      \"dependencies\": {\n        \"side-channel\": \"^1.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">=0.6\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/range-parser\": {\n      \"version\": \"1.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz\",\n      \"integrity\": \"sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.6\"\n      }\n    },\n    \"node_modules/raw-body\": {\n      \"version\": \"3.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz\",\n      \"integrity\": \"sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"bytes\": \"~3.1.2\",\n        \"http-errors\": \"~2.0.1\",\n        \"iconv-lite\": \"~0.7.0\",\n        \"unpipe\": \"~1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.10\"\n      }\n    },\n    \"node_modules/read-pkg\": {\n      \"version\": \"10.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/read-pkg/-/read-pkg-10.1.0.tgz\",\n      \"integrity\": \"sha512-I8g2lArQiP78ll51UeMZojewtYgIRCKCWqZEgOO8c/uefTI+XDXvCSXu3+YNUaTNvZzobrL5+SqHjBrByRRTdg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"@types/normalize-package-data\": \"^2.4.4\",\n        \"normalize-package-data\": \"^8.0.0\",\n        \"parse-json\": \"^8.3.0\",\n        \"type-fest\": \"^5.4.4\",\n        \"unicorn-magic\": \"^0.4.0\"\n      },\n      \"engines\": {\n        \"node\": \">=20\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/readable-stream\": {\n      \"version\": \"4.7.0\",\n      \"resolved\": \"https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz\",\n      \"integrity\": \"sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"abort-controller\": \"^3.0.0\",\n        \"buffer\": \"^6.0.3\",\n        \"events\": \"^3.3.0\",\n        \"process\": \"^0.11.10\",\n        \"string_decoder\": \"^1.3.0\"\n      },\n      \"engines\": {\n        \"node\": \"^12.22.0 || ^14.17.0 || >=16.0.0\"\n      }\n    },\n    \"node_modules/readable-stream/node_modules/buffer\": {\n      \"version\": \"6.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz\",\n      \"integrity\": \"sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==\",\n      \"funding\": [\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/feross\"\n        },\n        {\n          \"type\": \"patreon\",\n          \"url\": \"https://www.patreon.com/feross\"\n        },\n        {\n          \"type\": \"consulting\",\n          \"url\": \"https://feross.org/support\"\n        }\n      ],\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"base64-js\": \"^1.3.1\",\n        \"ieee754\": \"^1.2.1\"\n      }\n    },\n    \"node_modules/readdir-glob\": {\n      \"version\": \"1.1.3\",\n      \"resolved\": \"https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz\",\n      \"integrity\": \"sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"minimatch\": \"^5.1.0\"\n      }\n    },\n    \"node_modules/readdir-glob/node_modules/brace-expansion\": {\n      \"version\": \"2.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz\",\n      \"integrity\": \"sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"balanced-match\": \"^1.0.0\"\n      }\n    },\n    \"node_modules/readdir-glob/node_modules/minimatch\": {\n      \"version\": \"5.1.9\",\n      \"resolved\": \"https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz\",\n      \"integrity\": \"sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==\",\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"brace-expansion\": \"^2.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/resolve-from\": {\n      \"version\": \"5.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz\",\n      \"integrity\": \"sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/router\": {\n      \"version\": \"2.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/router/-/router-2.2.0.tgz\",\n      \"integrity\": \"sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"debug\": \"^4.4.0\",\n        \"depd\": \"^2.0.0\",\n        \"is-promise\": \"^4.0.0\",\n        \"parseurl\": \"^1.3.3\",\n        \"path-to-regexp\": \"^8.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 18\"\n      }\n    },\n    \"node_modules/rpc-websockets\": {\n      \"version\": \"10.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/rpc-websockets/-/rpc-websockets-10.0.0.tgz\",\n      \"integrity\": \"sha512-ci68pI2x0TZdrRbpFx8oiBosNUKR1a2Y9kADVwwhX6UUq+B1E9oqNXnxq20WvTwR7+3Dsow1qAtU8pPGoZE4sw==\",\n      \"deprecated\": \"deprecate 10.0.0\",\n      \"license\": \"LGPL-3.0-only\",\n      \"dependencies\": {\n        \"@swc/helpers\": \"^0.5.11\",\n        \"@types/uuid\": \"^8.3.4\",\n        \"@types/ws\": \"^8.2.2\",\n        \"buffer\": \"^6.0.3\",\n        \"eventemitter3\": \"^5.0.1\",\n        \"uuid\": \"^8.3.2\",\n        \"ws\": \"^8.5.0\"\n      },\n      \"funding\": {\n        \"type\": \"paypal\",\n        \"url\": \"https://paypal.me/kozjak\"\n      },\n      \"optionalDependencies\": {\n        \"bufferutil\": \"^4.0.1\",\n        \"utf-8-validate\": \"^5.0.2\"\n      }\n    },\n    \"node_modules/rpc-websockets/node_modules/buffer\": {\n      \"version\": \"6.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz\",\n      \"integrity\": \"sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==\",\n      \"funding\": [\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/feross\"\n        },\n        {\n          \"type\": \"patreon\",\n          \"url\": \"https://www.patreon.com/feross\"\n        },\n        {\n          \"type\": \"consulting\",\n          \"url\": \"https://feross.org/support\"\n        }\n      ],\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"base64-js\": \"^1.3.1\",\n        \"ieee754\": \"^1.2.1\"\n      }\n    },\n    \"node_modules/rpc-websockets/node_modules/uuid\": {\n      \"version\": \"8.3.2\",\n      \"resolved\": \"https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz\",\n      \"integrity\": \"sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==\",\n      \"license\": \"MIT\",\n      \"bin\": {\n        \"uuid\": \"dist/bin/uuid\"\n      }\n    },\n    \"node_modules/safe-buffer\": {\n      \"version\": \"5.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz\",\n      \"integrity\": \"sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/safer-buffer\": {\n      \"version\": \"2.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz\",\n      \"integrity\": \"sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/sanitize-filename\": {\n      \"version\": \"1.6.4\",\n      \"resolved\": \"https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.4.tgz\",\n      \"integrity\": \"sha512-9ZyI08PsvdQl2r/bBIGubpVdR3RR9sY6RDiWFPreA21C/EFlQhmgo20UZlNjZMMZNubusLhAQozkA0Od5J21Eg==\",\n      \"license\": \"WTFPL OR ISC\",\n      \"dependencies\": {\n        \"truncate-utf8-bytes\": \"^1.0.0\"\n      }\n    },\n    \"node_modules/select-hose\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz\",\n      \"integrity\": \"sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==\",\n      \"license\": \"MIT\",\n      \"optional\": true\n    },\n    \"node_modules/semver\": {\n      \"version\": \"7.7.4\",\n      \"resolved\": \"https://registry.npmjs.org/semver/-/semver-7.7.4.tgz\",\n      \"integrity\": \"sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==\",\n      \"license\": \"ISC\",\n      \"bin\": {\n        \"semver\": \"bin/semver.js\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/send\": {\n      \"version\": \"1.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/send/-/send-1.2.1.tgz\",\n      \"integrity\": \"sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"debug\": \"^4.4.3\",\n        \"encodeurl\": \"^2.0.0\",\n        \"escape-html\": \"^1.0.3\",\n        \"etag\": \"^1.8.1\",\n        \"fresh\": \"^2.0.0\",\n        \"http-errors\": \"^2.0.1\",\n        \"mime-types\": \"^3.0.2\",\n        \"ms\": \"^2.1.3\",\n        \"on-finished\": \"^2.4.1\",\n        \"range-parser\": \"^1.2.1\",\n        \"statuses\": \"^2.0.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 18\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/express\"\n      }\n    },\n    \"node_modules/serve-favicon\": {\n      \"version\": \"2.5.1\",\n      \"resolved\": \"https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.5.1.tgz\",\n      \"integrity\": \"sha512-JndLBslCLA/ebr7rS3d+/EKkzTsTi1jI2T9l+vHfAaGJ7A7NhtDpSZ0lx81HCNWnnE0yHncG+SSnVf9IMxOwXQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"etag\": \"~1.8.1\",\n        \"fresh\": \"~0.5.2\",\n        \"ms\": \"~2.1.3\",\n        \"parseurl\": \"~1.3.2\",\n        \"safe-buffer\": \"~5.2.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.8.0\"\n      }\n    },\n    \"node_modules/serve-favicon/node_modules/fresh\": {\n      \"version\": \"0.5.2\",\n      \"resolved\": \"https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz\",\n      \"integrity\": \"sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.6\"\n      }\n    },\n    \"node_modules/serve-favicon/node_modules/safe-buffer\": {\n      \"version\": \"5.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz\",\n      \"integrity\": \"sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==\",\n      \"funding\": [\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/feross\"\n        },\n        {\n          \"type\": \"patreon\",\n          \"url\": \"https://www.patreon.com/feross\"\n        },\n        {\n          \"type\": \"consulting\",\n          \"url\": \"https://feross.org/support\"\n        }\n      ],\n      \"license\": \"MIT\"\n    },\n    \"node_modules/serve-static\": {\n      \"version\": \"2.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz\",\n      \"integrity\": \"sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"encodeurl\": \"^2.0.0\",\n        \"escape-html\": \"^1.0.3\",\n        \"parseurl\": \"^1.3.3\",\n        \"send\": \"^1.2.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 18\"\n      },\n      \"funding\": {\n        \"type\": \"opencollective\",\n        \"url\": \"https://opencollective.com/express\"\n      }\n    },\n    \"node_modules/set-blocking\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz\",\n      \"integrity\": \"sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==\",\n      \"license\": \"ISC\"\n    },\n    \"node_modules/setprototypeof\": {\n      \"version\": \"1.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz\",\n      \"integrity\": \"sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==\",\n      \"license\": \"ISC\"\n    },\n    \"node_modules/sharp\": {\n      \"version\": \"0.34.5\",\n      \"resolved\": \"https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz\",\n      \"integrity\": \"sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==\",\n      \"hasInstallScript\": true,\n      \"license\": \"Apache-2.0\",\n      \"optional\": true,\n      \"dependencies\": {\n        \"@img/colour\": \"^1.0.0\",\n        \"detect-libc\": \"^2.1.2\",\n        \"semver\": \"^7.7.3\"\n      },\n      \"engines\": {\n        \"node\": \"^18.17.0 || ^20.3.0 || >=21.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://opencollective.com/libvips\"\n      },\n      \"optionalDependencies\": {\n        \"@img/sharp-darwin-arm64\": \"0.34.5\",\n        \"@img/sharp-darwin-x64\": \"0.34.5\",\n        \"@img/sharp-libvips-darwin-arm64\": \"1.2.4\",\n        \"@img/sharp-libvips-darwin-x64\": \"1.2.4\",\n        \"@img/sharp-libvips-linux-arm\": \"1.2.4\",\n        \"@img/sharp-libvips-linux-arm64\": \"1.2.4\",\n        \"@img/sharp-libvips-linux-ppc64\": \"1.2.4\",\n        \"@img/sharp-libvips-linux-riscv64\": \"1.2.4\",\n        \"@img/sharp-libvips-linux-s390x\": \"1.2.4\",\n        \"@img/sharp-libvips-linux-x64\": \"1.2.4\",\n        \"@img/sharp-libvips-linuxmusl-arm64\": \"1.2.4\",\n        \"@img/sharp-libvips-linuxmusl-x64\": \"1.2.4\",\n        \"@img/sharp-linux-arm\": \"0.34.5\",\n        \"@img/sharp-linux-arm64\": \"0.34.5\",\n        \"@img/sharp-linux-ppc64\": \"0.34.5\",\n        \"@img/sharp-linux-riscv64\": \"0.34.5\",\n        \"@img/sharp-linux-s390x\": \"0.34.5\",\n        \"@img/sharp-linux-x64\": \"0.34.5\",\n        \"@img/sharp-linuxmusl-arm64\": \"0.34.5\",\n        \"@img/sharp-linuxmusl-x64\": \"0.34.5\",\n        \"@img/sharp-wasm32\": \"0.34.5\",\n        \"@img/sharp-win32-arm64\": \"0.34.5\",\n        \"@img/sharp-win32-ia32\": \"0.34.5\",\n        \"@img/sharp-win32-x64\": \"0.34.5\"\n      }\n    },\n    \"node_modules/shebang-command\": {\n      \"version\": \"2.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz\",\n      \"integrity\": \"sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"shebang-regex\": \"^3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/shebang-regex\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz\",\n      \"integrity\": \"sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/shell-quote\": {\n      \"version\": \"1.8.3\",\n      \"resolved\": \"https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz\",\n      \"integrity\": \"sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/side-channel\": {\n      \"version\": \"1.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz\",\n      \"integrity\": \"sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"es-errors\": \"^1.3.0\",\n        \"object-inspect\": \"^1.13.3\",\n        \"side-channel-list\": \"^1.0.0\",\n        \"side-channel-map\": \"^1.0.1\",\n        \"side-channel-weakmap\": \"^1.0.2\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/side-channel-list\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz\",\n      \"integrity\": \"sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"es-errors\": \"^1.3.0\",\n        \"object-inspect\": \"^1.13.4\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/side-channel-map\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz\",\n      \"integrity\": \"sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"call-bound\": \"^1.0.2\",\n        \"es-errors\": \"^1.3.0\",\n        \"get-intrinsic\": \"^1.2.5\",\n        \"object-inspect\": \"^1.13.3\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/side-channel-weakmap\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz\",\n      \"integrity\": \"sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"call-bound\": \"^1.0.2\",\n        \"es-errors\": \"^1.3.0\",\n        \"get-intrinsic\": \"^1.2.5\",\n        \"object-inspect\": \"^1.13.3\",\n        \"side-channel-map\": \"^1.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.4\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/ljharb\"\n      }\n    },\n    \"node_modules/signal-exit\": {\n      \"version\": \"3.0.7\",\n      \"resolved\": \"https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz\",\n      \"integrity\": \"sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==\",\n      \"license\": \"ISC\"\n    },\n    \"node_modules/spdx-correct\": {\n      \"version\": \"3.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz\",\n      \"integrity\": \"sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"spdx-expression-parse\": \"^3.0.0\",\n        \"spdx-license-ids\": \"^3.0.0\"\n      }\n    },\n    \"node_modules/spdx-exceptions\": {\n      \"version\": \"2.5.0\",\n      \"resolved\": \"https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz\",\n      \"integrity\": \"sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==\",\n      \"license\": \"CC-BY-3.0\"\n    },\n    \"node_modules/spdx-expression-parse\": {\n      \"version\": \"3.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz\",\n      \"integrity\": \"sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"spdx-exceptions\": \"^2.1.0\",\n        \"spdx-license-ids\": \"^3.0.0\"\n      }\n    },\n    \"node_modules/spdx-license-ids\": {\n      \"version\": \"3.0.23\",\n      \"resolved\": \"https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz\",\n      \"integrity\": \"sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==\",\n      \"license\": \"CC0-1.0\"\n    },\n    \"node_modules/spdy\": {\n      \"version\": \"4.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz\",\n      \"integrity\": \"sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==\",\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"dependencies\": {\n        \"debug\": \"^4.1.0\",\n        \"handle-thing\": \"^2.0.0\",\n        \"http-deceiver\": \"^1.2.7\",\n        \"select-hose\": \"^2.0.0\",\n        \"spdy-transport\": \"^3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6.0.0\"\n      }\n    },\n    \"node_modules/spdy-transport\": {\n      \"version\": \"3.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz\",\n      \"integrity\": \"sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==\",\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"dependencies\": {\n        \"debug\": \"^4.1.0\",\n        \"detect-node\": \"^2.0.4\",\n        \"hpack.js\": \"^2.1.6\",\n        \"obuf\": \"^1.1.2\",\n        \"readable-stream\": \"^3.0.6\",\n        \"wbuf\": \"^1.7.3\"\n      }\n    },\n    \"node_modules/spdy-transport/node_modules/readable-stream\": {\n      \"version\": \"3.6.2\",\n      \"resolved\": \"https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz\",\n      \"integrity\": \"sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==\",\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"dependencies\": {\n        \"inherits\": \"^2.0.3\",\n        \"string_decoder\": \"^1.1.1\",\n        \"util-deprecate\": \"^1.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 6\"\n      }\n    },\n    \"node_modules/statuses\": {\n      \"version\": \"2.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz\",\n      \"integrity\": \"sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      }\n    },\n    \"node_modules/stream-buffers\": {\n      \"version\": \"2.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz\",\n      \"integrity\": \"sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==\",\n      \"license\": \"Unlicense\",\n      \"engines\": {\n        \"node\": \">= 0.10.0\"\n      }\n    },\n    \"node_modules/stream-combiner\": {\n      \"version\": \"0.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz\",\n      \"integrity\": \"sha512-6yHMqgLYDzQDcAkL+tjJDC5nSNuNIx0vZtRZeiPh7Saef7VHX9H5Ijn9l2VIol2zaNYlYEX6KyuT/237A58qEQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"duplexer\": \"~0.1.1\",\n        \"through\": \"~2.3.4\"\n      }\n    },\n    \"node_modules/streamx\": {\n      \"version\": \"2.25.0\",\n      \"resolved\": \"https://registry.npmjs.org/streamx/-/streamx-2.25.0.tgz\",\n      \"integrity\": \"sha512-0nQuG6jf1w+wddNEEXCF4nTg3LtufWINB5eFEN+5TNZW7KWJp6x87+JFL43vaAUPyCfH1wID+mNVyW6OHtFamg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"events-universal\": \"^1.0.0\",\n        \"fast-fifo\": \"^1.3.2\",\n        \"text-decoder\": \"^1.1.0\"\n      }\n    },\n    \"node_modules/string_decoder\": {\n      \"version\": \"1.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz\",\n      \"integrity\": \"sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"safe-buffer\": \"~5.2.0\"\n      }\n    },\n    \"node_modules/string_decoder/node_modules/safe-buffer\": {\n      \"version\": \"5.2.1\",\n      \"resolved\": \"https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz\",\n      \"integrity\": \"sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==\",\n      \"funding\": [\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/feross\"\n        },\n        {\n          \"type\": \"patreon\",\n          \"url\": \"https://www.patreon.com/feross\"\n        },\n        {\n          \"type\": \"consulting\",\n          \"url\": \"https://feross.org/support\"\n        }\n      ],\n      \"license\": \"MIT\"\n    },\n    \"node_modules/string-width\": {\n      \"version\": \"4.2.3\",\n      \"resolved\": \"https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz\",\n      \"integrity\": \"sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"emoji-regex\": \"^8.0.0\",\n        \"is-fullwidth-code-point\": \"^3.0.0\",\n        \"strip-ansi\": \"^6.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/string-width-cjs\": {\n      \"name\": \"string-width\",\n      \"version\": \"4.2.3\",\n      \"resolved\": \"https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz\",\n      \"integrity\": \"sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"emoji-regex\": \"^8.0.0\",\n        \"is-fullwidth-code-point\": \"^3.0.0\",\n        \"strip-ansi\": \"^6.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/strip-ansi\": {\n      \"version\": \"6.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz\",\n      \"integrity\": \"sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"ansi-regex\": \"^5.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/strip-ansi-cjs\": {\n      \"name\": \"strip-ansi\",\n      \"version\": \"6.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz\",\n      \"integrity\": \"sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"ansi-regex\": \"^5.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/strip-ansi-cjs/node_modules/ansi-regex\": {\n      \"version\": \"5.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz\",\n      \"integrity\": \"sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/strip-ansi/node_modules/ansi-regex\": {\n      \"version\": \"5.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz\",\n      \"integrity\": \"sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/supports-color\": {\n      \"version\": \"10.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/supports-color/-/supports-color-10.2.2.tgz\",\n      \"integrity\": \"sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/supports-color?sponsor=1\"\n      }\n    },\n    \"node_modules/tagged-tag\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz\",\n      \"integrity\": \"sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=20\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/tar-stream\": {\n      \"version\": \"3.1.8\",\n      \"resolved\": \"https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.8.tgz\",\n      \"integrity\": \"sha512-U6QpVRyCGHva435KoNWy9PRoi2IFYCgtEhq9nmrPPpbRacPs9IH4aJ3gbrFC8dPcXvdSZ4XXfXT5Fshbp2MtlQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"b4a\": \"^1.6.4\",\n        \"bare-fs\": \"^4.5.5\",\n        \"fast-fifo\": \"^1.2.0\",\n        \"streamx\": \"^2.15.0\"\n      }\n    },\n    \"node_modules/teen_process\": {\n      \"version\": \"4.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/teen_process/-/teen_process-4.1.0.tgz\",\n      \"integrity\": \"sha512-AN8y3MYPExB3r2mkkX9r0wEF4xPfhKOj6YvcfeIqQai+GVhTIhjjdkPvwI5CFT4z8UQ5aZWldzbJ+jNejYAdGw==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"lodash\": \"^4.17.21\",\n        \"shell-quote\": \"^1.8.1\"\n      },\n      \"engines\": {\n        \"node\": \"^20.19.0 || ^22.12.0 || >=24.0.0\",\n        \"npm\": \">=10\"\n      }\n    },\n    \"node_modules/teex\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/teex/-/teex-1.0.1.tgz\",\n      \"integrity\": \"sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"streamx\": \"^2.12.5\"\n      }\n    },\n    \"node_modules/text-decoder\": {\n      \"version\": \"1.2.7\",\n      \"resolved\": \"https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.7.tgz\",\n      \"integrity\": \"sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"b4a\": \"^1.6.4\"\n      }\n    },\n    \"node_modules/through\": {\n      \"version\": \"2.3.8\",\n      \"resolved\": \"https://registry.npmjs.org/through/-/through-2.3.8.tgz\",\n      \"integrity\": \"sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/toidentifier\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz\",\n      \"integrity\": \"sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=0.6\"\n      }\n    },\n    \"node_modules/truncate-utf8-bytes\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz\",\n      \"integrity\": \"sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==\",\n      \"license\": \"WTFPL\",\n      \"dependencies\": {\n        \"utf8-byte-length\": \"^1.0.1\"\n      }\n    },\n    \"node_modules/tslib\": {\n      \"version\": \"2.8.1\",\n      \"resolved\": \"https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz\",\n      \"integrity\": \"sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==\",\n      \"license\": \"0BSD\"\n    },\n    \"node_modules/type-fest\": {\n      \"version\": \"5.5.0\",\n      \"resolved\": \"https://registry.npmjs.org/type-fest/-/type-fest-5.5.0.tgz\",\n      \"integrity\": \"sha512-PlBfpQwiUvGViBNX84Yxwjsdhd1TUlXr6zjX7eoirtCPIr08NAmxwa+fcYBTeRQxHo9YC9wwF3m9i700sHma8g==\",\n      \"license\": \"(MIT OR CC0-1.0)\",\n      \"dependencies\": {\n        \"tagged-tag\": \"^1.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=20\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/type-is\": {\n      \"version\": \"2.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz\",\n      \"integrity\": \"sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"content-type\": \"^1.0.5\",\n        \"media-typer\": \"^1.1.0\",\n        \"mime-types\": \"^3.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 0.6\"\n      }\n    },\n    \"node_modules/undici-types\": {\n      \"version\": \"7.19.2\",\n      \"resolved\": \"https://registry.npmjs.org/undici-types/-/undici-types-7.19.2.tgz\",\n      \"integrity\": \"sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/unicorn-magic\": {\n      \"version\": \"0.4.0\",\n      \"resolved\": \"https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.4.0.tgz\",\n      \"integrity\": \"sha512-wH590V9VNgYH9g3lH9wWjTrUoKsjLF6sGLjhR4sH1LWpLmCOH0Zf7PukhDA8BiS7KHe4oPNkcTHqYkj7SOGUOw==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=20\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/unorm\": {\n      \"version\": \"1.6.0\",\n      \"resolved\": \"https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz\",\n      \"integrity\": \"sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==\",\n      \"license\": \"MIT or GPL-2.0\",\n      \"engines\": {\n        \"node\": \">= 0.4.0\"\n      }\n    },\n    \"node_modules/unpipe\": {\n      \"version\": \"1.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz\",\n      \"integrity\": \"sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      }\n    },\n    \"node_modules/utf-8-validate\": {\n      \"version\": \"5.0.10\",\n      \"resolved\": \"https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz\",\n      \"integrity\": \"sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==\",\n      \"hasInstallScript\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"dependencies\": {\n        \"node-gyp-build\": \"^4.3.0\"\n      },\n      \"engines\": {\n        \"node\": \">=6.14.2\"\n      }\n    },\n    \"node_modules/utf8-byte-length\": {\n      \"version\": \"1.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz\",\n      \"integrity\": \"sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==\",\n      \"license\": \"(WTFPL OR MIT)\"\n    },\n    \"node_modules/util-deprecate\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz\",\n      \"integrity\": \"sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==\",\n      \"license\": \"MIT\"\n    },\n    \"node_modules/uuid\": {\n      \"version\": \"13.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/uuid/-/uuid-13.0.0.tgz\",\n      \"integrity\": \"sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==\",\n      \"funding\": [\n        \"https://github.com/sponsors/broofa\",\n        \"https://github.com/sponsors/ctavan\"\n      ],\n      \"license\": \"MIT\",\n      \"bin\": {\n        \"uuid\": \"dist-node/bin/uuid\"\n      }\n    },\n    \"node_modules/validate-npm-package-license\": {\n      \"version\": \"3.0.4\",\n      \"resolved\": \"https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz\",\n      \"integrity\": \"sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"spdx-correct\": \"^3.0.0\",\n        \"spdx-expression-parse\": \"^3.0.0\"\n      }\n    },\n    \"node_modules/vary\": {\n      \"version\": \"1.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/vary/-/vary-1.1.2.tgz\",\n      \"integrity\": \"sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">= 0.8\"\n      }\n    },\n    \"node_modules/wbuf\": {\n      \"version\": \"1.7.3\",\n      \"resolved\": \"https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz\",\n      \"integrity\": \"sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==\",\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"dependencies\": {\n        \"minimalistic-assert\": \"^1.0.0\"\n      }\n    },\n    \"node_modules/which\": {\n      \"version\": \"6.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/which/-/which-6.0.1.tgz\",\n      \"integrity\": \"sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==\",\n      \"license\": \"ISC\",\n      \"dependencies\": {\n        \"isexe\": \"^4.0.0\"\n      },\n      \"bin\": {\n        \"node-which\": \"bin/which.js\"\n      },\n      \"engines\": {\n        \"node\": \"^20.17.0 || >=22.9.0\"\n      }\n    },\n    \"node_modules/wrap-ansi\": {\n      \"version\": \"9.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz\",\n      \"integrity\": \"sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==\",\n      \"extraneous\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"ansi-styles\": \"^6.2.1\",\n        \"string-width\": \"^7.0.0\",\n        \"strip-ansi\": \"^7.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/wrap-ansi?sponsor=1\"\n      }\n    },\n    \"node_modules/wrap-ansi-cjs\": {\n      \"name\": \"wrap-ansi\",\n      \"version\": \"7.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz\",\n      \"integrity\": \"sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"ansi-styles\": \"^4.0.0\",\n        \"string-width\": \"^4.1.0\",\n        \"strip-ansi\": \"^6.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">=10\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/wrap-ansi?sponsor=1\"\n      }\n    },\n    \"node_modules/wrap-ansi/node_modules/ansi-styles\": {\n      \"version\": \"6.2.3\",\n      \"resolved\": \"https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz\",\n      \"integrity\": \"sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==\",\n      \"extraneous\": true,\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/ansi-styles?sponsor=1\"\n      }\n    },\n    \"node_modules/wrap-ansi/node_modules/emoji-regex\": {\n      \"version\": \"10.6.0\",\n      \"resolved\": \"https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz\",\n      \"integrity\": \"sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==\",\n      \"extraneous\": true,\n      \"license\": \"MIT\"\n    },\n    \"node_modules/wrap-ansi/node_modules/string-width\": {\n      \"version\": \"7.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz\",\n      \"integrity\": \"sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==\",\n      \"extraneous\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"emoji-regex\": \"^10.3.0\",\n        \"get-east-asian-width\": \"^1.0.0\",\n        \"strip-ansi\": \"^7.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/wrap-ansi/node_modules/strip-ansi\": {\n      \"version\": \"7.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz\",\n      \"integrity\": \"sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==\",\n      \"extraneous\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"ansi-regex\": \"^6.2.2\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/strip-ansi?sponsor=1\"\n      }\n    },\n    \"node_modules/wrappy\": {\n      \"version\": \"1.0.2\",\n      \"resolved\": \"https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz\",\n      \"integrity\": \"sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==\",\n      \"license\": \"ISC\"\n    },\n    \"node_modules/ws\": {\n      \"version\": \"8.20.0\",\n      \"resolved\": \"https://registry.npmjs.org/ws/-/ws-8.20.0.tgz\",\n      \"integrity\": \"sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=10.0.0\"\n      },\n      \"peerDependencies\": {\n        \"bufferutil\": \"^4.0.1\",\n        \"utf-8-validate\": \">=5.0.2\"\n      },\n      \"peerDependenciesMeta\": {\n        \"bufferutil\": {\n          \"optional\": true\n        },\n        \"utf-8-validate\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/xmlbuilder\": {\n      \"version\": \"15.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz\",\n      \"integrity\": \"sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=8.0\"\n      }\n    },\n    \"node_modules/xpath\": {\n      \"version\": \"0.0.34\",\n      \"resolved\": \"https://registry.npmjs.org/xpath/-/xpath-0.0.34.tgz\",\n      \"integrity\": \"sha512-FxF6+rkr1rNSQrhUNYrAFJpRXNzlDoMxeXN5qI84939ylEv3qqPFKa85Oxr6tDaJKqwW6KKyo2v26TSv3k6LeA==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=0.6.0\"\n      }\n    },\n    \"node_modules/y18n\": {\n      \"version\": \"5.0.8\",\n      \"resolved\": \"https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz\",\n      \"integrity\": \"sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==\",\n      \"extraneous\": true,\n      \"license\": \"ISC\",\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/yargs\": {\n      \"version\": \"18.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz\",\n      \"integrity\": \"sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==\",\n      \"extraneous\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"cliui\": \"^9.0.1\",\n        \"escalade\": \"^3.1.1\",\n        \"get-caller-file\": \"^2.0.5\",\n        \"string-width\": \"^7.2.0\",\n        \"y18n\": \"^5.0.5\",\n        \"yargs-parser\": \"^22.0.0\"\n      },\n      \"engines\": {\n        \"node\": \"^20.19.0 || ^22.12.0 || >=23\"\n      }\n    },\n    \"node_modules/yargs-parser\": {\n      \"version\": \"22.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz\",\n      \"integrity\": \"sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==\",\n      \"extraneous\": true,\n      \"license\": \"ISC\",\n      \"engines\": {\n        \"node\": \"^20.19.0 || ^22.12.0 || >=23\"\n      }\n    },\n    \"node_modules/yargs/node_modules/emoji-regex\": {\n      \"version\": \"10.6.0\",\n      \"resolved\": \"https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz\",\n      \"integrity\": \"sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==\",\n      \"extraneous\": true,\n      \"license\": \"MIT\"\n    },\n    \"node_modules/yargs/node_modules/string-width\": {\n      \"version\": \"7.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz\",\n      \"integrity\": \"sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==\",\n      \"extraneous\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"emoji-regex\": \"^10.3.0\",\n        \"get-east-asian-width\": \"^1.0.0\",\n        \"strip-ansi\": \"^7.1.0\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/yargs/node_modules/strip-ansi\": {\n      \"version\": \"7.2.0\",\n      \"resolved\": \"https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz\",\n      \"integrity\": \"sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==\",\n      \"extraneous\": true,\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"ansi-regex\": \"^6.2.2\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/chalk/strip-ansi?sponsor=1\"\n      }\n    },\n    \"node_modules/yauzl\": {\n      \"version\": \"3.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/yauzl/-/yauzl-3.3.0.tgz\",\n      \"integrity\": \"sha512-PtGEvEP30p7sbIBJKUBjUnqgTVOyMURc4dLo9iNyAJnNIEz9pm88cCXF21w94Kg3k6RXkeZh5DHOGS0qEONvNQ==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"buffer-crc32\": \"~0.2.3\",\n        \"pend\": \"~1.2.0\"\n      },\n      \"engines\": {\n        \"node\": \">=12\"\n      }\n    },\n    \"node_modules/yauzl/node_modules/buffer-crc32\": {\n      \"version\": \"0.2.13\",\n      \"resolved\": \"https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz\",\n      \"integrity\": \"sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \"*\"\n      }\n    },\n    \"node_modules/yocto-queue\": {\n      \"version\": \"1.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz\",\n      \"integrity\": \"sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=12.20\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/yoctocolors\": {\n      \"version\": \"2.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.2.tgz\",\n      \"integrity\": \"sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==\",\n      \"license\": \"MIT\",\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/sindresorhus\"\n      }\n    },\n    \"node_modules/zip-stream\": {\n      \"version\": \"6.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/zip-stream/-/zip-stream-6.0.1.tgz\",\n      \"integrity\": \"sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==\",\n      \"license\": \"MIT\",\n      \"dependencies\": {\n        \"archiver-utils\": \"^5.0.0\",\n        \"compress-commons\": \"^6.0.2\",\n        \"readable-stream\": \"^4.0.0\"\n      },\n      \"engines\": {\n        \"node\": \">= 14\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "driver/package.json",
    "content": "{\n  \"name\": \"appium-flutter-driver\",\n  \"description\": \"Appium Flutter driver\",\n  \"keywords\": [\n    \"appium\",\n    \"flutter\"\n  ],\n  \"version\": \"3.6.0\",\n  \"author\": \"TruongSinh Tran-Nguyen <i@truongsinh.pro>\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/appium/appium-flutter-driver.git\"\n  },\n  \"engines\": {\n    \"node\": \"^20.19.0 || ^22.12.0 || >=24.0.0\",\n    \"npm\": \">=10\"\n  },\n  \"main\": \"./build/lib/driver.js\",\n  \"types\": \"./build/lib/index.d.ts\",\n  \"appium\": {\n    \"driverName\": \"flutter\",\n    \"automationName\": \"Flutter\",\n    \"platformNames\": [\n      \"iOS\",\n      \"Android\"\n    ],\n    \"mainClass\": \"FlutterDriver\",\n    \"doctor\": {\n      \"checks\": [\n        \"./build/lib/doctor/checks.js\"\n      ]\n    },\n    \"scripts\": {\n      \"download-wda-sim\": \"./scripts/download-wda-sim.mjs\"\n    }\n  },\n  \"bin\": {},\n  \"directories\": {\n    \"lib\": \"lib\"\n  },\n  \"files\": [\n    \"lib\",\n    \"build\",\n    \"!build/tsconfig.tsbuildinfo\",\n    \"LICENSE\",\n    \"npm-shrinkwrap.json\",\n    \"scripts\"\n  ],\n  \"scripts\": {\n    \"build\": \"tsc -b\",\n    \"dev\": \"npm run build -- --watch\",\n    \"clean\": \"npm run build -- --clean\",\n    \"lint\": \"eslint .\",\n    \"lint:fix\": \"npm run lint -- --fix\",\n    \"format\": \"prettier -w ./lib\",\n    \"format:check\": \"prettier --check ./lib\",\n    \"prepublishOnly\": \"cp ../README.md ../LICENSE ./\",\n    \"prepare\": \"npm run clean && npm run build\",\n    \"test\": \"echo no test\",\n    \"clean-dependency\": \"rm -rf node_modules && rm -f package-lock.json\"\n  },\n  \"peerDependencies\": {\n    \"appium\": \"^3.0.0\"\n  },\n  \"devDependencies\": {\n    \"@appium/eslint-config-appium-ts\": \"^3.0.0\",\n    \"@appium/tsconfig\": \"^1.0.0\",\n    \"@appium/types\": \"^1.0.0\",\n    \"@semantic-release/changelog\": \"^6.0.3\",\n    \"@semantic-release/git\": \"^10.0.1\",\n    \"prettier\": \"^3.0.0\",\n    \"semantic-release\": \"^25.0.2\",\n    \"ts-node\": \"^10.9.1\",\n    \"typescript\": \"~6.0\"\n  },\n  \"dependencies\": {\n    \"appium-android-driver\": \"^13.0.0\",\n    \"appium-flutter-finder\": \"^0.2.0\",\n    \"appium-ios-device\": \"^3.0.0\",\n    \"appium-uiautomator2-driver\": \"^7.0.0\",\n    \"appium-xcuitest-driver\": \"^10.0.0\",\n    \"asyncbox\": \"^6.0.1\",\n    \"bluebird\": \"^3.1.1\",\n    \"lodash\": \"^4.0.0\",\n    \"portscanner\": \"^2.2.0\",\n    \"rpc-websockets\": \"^10.0.0\"\n  },\n  \"prettier\": {\n    \"bracketSpacing\": false,\n    \"printWidth\": 100,\n    \"singleQuote\": true\n  }\n}\n"
  },
  {
    "path": "driver/release.sh",
    "content": "# !/bin/sh\n\necho \"refreshing dependencies\"\nrm npm-shrinkwrap.json\nAPPIUM_SKIP_CHROMEDRIVER_INSTALL=1 npm run clean-dependency\nnpm install --production\nnpm prune --omit=dev --omit=peer\nrm -rf node_modules/appium\nnpm shrinkwrap --omit=dev --omit=peer\n\n# to install types again\nnpm install --only=dev --no-package-lock\n\necho \"complete the refreshment\"\n"
  },
  {
    "path": "driver/scripts/download-wda-sim.mjs",
    "content": "// TODO: Please revert '@appium/support' to 'appium/support.js' and \"@appium/support\" dependency\n// in Appium 3 based version\nimport {fs, logger, zip, net, node} from '@appium/support';\nimport _ from 'lodash';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nconst log = logger.getLogger('download-wda-sim');\nconst wdaUrl = (version, zipFileName) =>\n  `https://github.com/appium/WebDriverAgent/releases/download/v${version}/${zipFileName}`;\nconst destZip = (platform) => {\n  const scheme = `WebDriverAgentRunner${_.toLower(platform) === 'tvos' ? '_tvOS' : ''}`;\n  return `${scheme}-Build-Sim-${os.arch() === 'arm64' ? 'arm64' : 'x86_64'}.zip`;\n};\n\n/**\n * Get the value of the given argument name.\n *\n * @param {string} argName\n * @returns {string?} The value of the given 'argName'.\n */\nexport function parseArgValue(argName) {\n  const argNamePattern = new RegExp(`^--${argName}\\\\b`);\n  for (let i = 1; i < process.argv.length; ++i) {\n    const arg = process.argv[i];\n    if (argNamePattern.test(arg)) {\n      return arg.includes('=') ? arg.split('=')[1] : process.argv[i + 1];\n    }\n  }\n  return null;\n}\n\n/**\n * Return installed appium-webdriveragent package version\n * @returns {number}\n */\nasync function webdriveragentPkgVersion() {\n  const __filename = fileURLToPath(import.meta.url);\n  const __dirname = path.dirname(__filename);\n  const pkgPath = path.join(\n    node.getModuleRootSync('appium-flutter-driver', __dirname),\n    'node_modules',\n    'appium-xcuitest-driver',\n    'node_modules',\n    'appium-webdriveragent',\n    'package.json'\n  );\n  return JSON.parse(await fs.readFile(pkgPath, 'utf8')).version;\n};\n\n/**\n * Prepare the working root directory.\n * @returns {string} Root directory to download and unzip.\n */\nasync function prepareRootDir() {\n  const destDirRoot = parseArgValue('outdir');\n  if (!destDirRoot) {\n    throw new Error(`--outdir is required`);\n  }\n  const destDir = path.resolve(process.cwd(), destDirRoot);\n  if (await fs.exists(destDir)) {\n    throw new Error(`${destDir} already exists`);\n  }\n  await fs.mkdir(destDir, {recursive: true});\n  return destDir;\n}\n\nasync function getWDAPrebuiltPackage() {\n  const destDir = await prepareRootDir();\n  const platform = parseArgValue('platform');\n  const zipFileName = destZip(platform);\n  const wdaVersion = await webdriveragentPkgVersion();\n  const urlToDownload = wdaUrl(wdaVersion, zipFileName);\n  const downloadedZipFile = path.join(destDir, zipFileName);\n  try {\n    log.info(`Downloading ${urlToDownload}`);\n    await net.downloadFile(urlToDownload, downloadedZipFile);\n\n    log.info(`Unpacking ${downloadedZipFile} into ${destDir}`);\n    await zip.extractAllTo(downloadedZipFile, destDir);\n\n    log.info(`Deleting ${downloadedZipFile}`);\n  } finally {\n    if (await fs.exists(downloadedZipFile)) {\n      await fs.unlink(downloadedZipFile);\n    }\n  }\n}\n\n(async () => await getWDAPrebuiltPackage())();\n"
  },
  {
    "path": "driver/tsconfig.json",
    "content": "{\n  \"$schema\": \"https://json.schemastore.org/tsconfig\",\n  \"extends\": \"@appium/tsconfig/tsconfig.json\",\n  \"compilerOptions\": {\n    \"esModuleInterop\": true,\n    \"strict\": false,  // TODO: make this flag true\n    \"outDir\": \"build\",\n    \"types\": [\"node\"],\n    \"checkJs\": true\n  },\n  \"include\": [\"lib\"]\n}\n"
  },
  {
    "path": "example/.gitignore",
    "content": "apps/\n"
  },
  {
    "path": "example/dart/drag_commands.dart",
    "content": "import 'dart:async';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_driver/driver_extension.dart';\nimport 'package:flutter_driver/src/common/message.dart';\nimport 'package:flutter_driver/src/extension/extension.dart';\nimport 'package:flutter_test/flutter_test.dart';\n\n\nclass DragCommand extends Command {\n  final double startX;\n  final double startY;\n  final double endX;\n  final double endY;\n  final Duration duration;\n\n  DragCommand(this.startX, this.startY, this.endX, this.endY, this.duration);\n\n  @override\n  String get kind => 'dragAndDropWithCommandExtension';\n\n  DragCommand.deserialize(Map<String, String> params)\n      : startX = double.parse(params['startX']!),\n        startY = double.parse(params['startY']!),\n        endX = double.parse(params['endX']!),\n        endY = double.parse(params['endY']!),\n        duration = Duration(milliseconds: int.parse(params['duration']!));\n}\n\n\nclass DragResult extends Result {\n  final bool success;\n\n  const DragResult(this.success);\n\n  @override\n  Map<String, dynamic> toJson() {\n    return {\n      'success': success,\n    };\n  }\n}\n\n\nclass DragCommandExtension extends CommandExtension {\n  @override\n  Future<Result> call(Command command, WidgetController prober,\n      CreateFinderFactory finderFactory, CommandHandlerFactory handlerFactory) async {\n    final DragCommand dragCommand = command as DragCommand;\n\n    final Offset startLocation = Offset(dragCommand.startX, dragCommand.startY);\n    final Offset offset = Offset(dragCommand.endX - dragCommand.startX, dragCommand.endY - dragCommand.startY);\n\n    await prober.timedDragFrom(startLocation, offset, dragCommand.duration);\n\n    return const DragResult(true);\n  }\n\n  @override\n  String get commandKind => 'dragAndDropWithCommandExtension';\n\n  @override\n  Command deserialize(\n      Map<String, String> params,\n      DeserializeFinderFactory finderFactory,\n      DeserializeCommandFactory commandFactory) {\n    return DragCommand.deserialize(params);\n  }\n}\n"
  },
  {
    "path": "example/dart/get_text_command.dart",
    "content": "import 'dart:convert';\n\nimport 'package:flutter/material.dart';\nimport 'package:flutter/widgets.dart';\nimport 'package:flutter_driver/driver_extension.dart';\nimport 'package:flutter_driver/src/common/find.dart';\nimport 'package:flutter_driver/src/common/message.dart';\nimport 'package:flutter_test/flutter_test.dart';\n\nclass Base64URL {\n  static String encode(String str) {\n    String base64 = base64Encode(utf8.encode(str));\n    return base64.replaceAll('+', '-').replaceAll('/', '_').replaceAll('=', '');\n  }\n\n  static String decode(String str) {\n    String base64 = str.replaceAll('-', '+').replaceAll('_', '/');\n\n    // Add padding if needed\n    switch (base64.length % 4) {\n      case 2:\n        base64 += '==';\n        break;\n      case 3:\n        base64 += '=';\n        break;\n    }\n\n    return utf8.decode(base64Decode(base64));\n  }\n}\n\nclass FinderHelper {\n  static SerializableFinder deserializeBase64(String base64Str) {\n    try {\n      // Decode base64 to JSON string\n      final jsonStr = Base64URL.decode(base64Str);\n\n      // Parse JSON\n      final dynamic finderData = json.decode(jsonStr);\n\n      if (finderData is! Map<String, dynamic>) {\n        throw Exception('finder is not valid');\n      }\n\n      if (!finderData.containsKey('finderType')) {\n        throw Exception('Invalid finder format: missing finderType');\n      }\n\n      final String finderType = finderData['finderType'] as String;\n\n      switch (finderType) {\n        case 'ByText':\n          return ByText(finderData['text'] as String);\n\n        case 'ByType':\n          return ByType(finderData['type'] as String);\n\n        case 'ByValueKey':\n          final keyType = finderData['keyValueType'] as String?;\n          final keyValue = finderData['keyValueString'] as String;\n\n          if (keyType == 'int') {\n            return ByValueKey(int.parse(keyValue));\n          }\n          return ByValueKey(keyValue);\n\n        case 'Ancestor':\n          // Parse of and matching which are JSON strings\n          final ofJson = json.decode(finderData['of'] as String);\n          final matchingJson = json.decode(finderData['matching'] as String);\n\n          return Ancestor(\n            of: deserializeBase64(Base64URL.encode(json.encode(ofJson))),\n            matching:\n                deserializeBase64(Base64URL.encode(json.encode(matchingJson))),\n            matchRoot: finderData['matchRoot'] == 'true',\n            firstMatchOnly: finderData['firstMatchOnly'] == 'true',\n          );\n\n        case 'Descendant':\n          final ofJson = json.decode(finderData['of'] as String);\n          final matchingJson = json.decode(finderData['matching'] as String);\n\n          return Descendant(\n            of: deserializeBase64(Base64URL.encode(json.encode(ofJson))),\n            matching:\n                deserializeBase64(Base64URL.encode(json.encode(matchingJson))),\n            matchRoot: finderData['matchRoot'] == 'true',\n            firstMatchOnly: finderData['firstMatchOnly'] == 'true',\n          );\n\n        default:\n          throw Exception('Unsupported finder type: $finderType');\n      }\n    } catch (e) {\n      throw Exception('Error deserializing finder: $e');\n    }\n  }\n}\n\nclass GetTextCommandExtension extends CommandExtension {\n  String? getTextFromWidget(Text widget) {\n    return widget.data ?? widget.textSpan?.toPlainText();\n  }\n\n  @override\n  Future<Result> call(\n      Command command,\n      WidgetController prober,\n      CreateFinderFactory finderFactory,\n      CommandHandlerFactory handlerFactory) async {\n    final GetTextCommand dragCommand = command as GetTextCommand;\n\n    // Create finder for Text widget\n    final type = dragCommand.base64Element;\n    // decodeBase64 to json\n    SerializableFinder serializableFinder =\n        FinderHelper.deserializeBase64(type);\n\n    final Finder finder = finderFactory.createFinder(serializableFinder);\n\n    // Get the widget element\n    final Element element = prober.element(finder);\n\n    // if element is not a Text widget, return false with error\n    if (element.widget is! Text) {\n      return const GetTextResult(false, data: {\n        'errorCode': 'NOT_A_TEXT_WIDGET',\n        'error': 'Found element is not a Text widget'\n      });\n    }\n\n    final text = getTextFromWidget(element.widget as Text);\n    return text != null\n        ? GetTextResult(true, data: {'text': text})\n        : const GetTextResult(false, data: {\n            'errorCode': 'NO_TEXT_CONTENT',\n            'error': 'No text content found'\n          });\n  }\n\n  @override\n  String get commandKind => 'getTextWithCommandExtension';\n\n  @override\n  Command deserialize(\n      Map<String, String> params,\n      DeserializeFinderFactory finderFactory,\n      DeserializeCommandFactory commandFactory) {\n    return GetTextCommand.deserialize(params);\n  }\n}\n\nclass GetTextCommand extends Command {\n  final String base64Element;\n\n  GetTextCommand(this.base64Element);\n\n  @override\n  String get kind => 'getTextWithCommandExtension';\n\n  GetTextCommand.deserialize(Map<String, String> params)\n      : base64Element = params['findBy']!;\n}\n\nclass GetTextResult extends Result {\n  final bool success;\n  final Map<String, dynamic>? data;\n\n  const GetTextResult(this.success, {this.data});\n\n  @override\n  Map<String, dynamic> toJson() {\n    return <String, dynamic>{\n      'success': success,\n      if (data != null) ...data!,\n    };\n  }\n}\n"
  },
  {
    "path": "example/flutter_app_under_test/.gitignore",
    "content": "# Miscellaneous\n*.class\n*.log\n*.pyc\n*.swp\n.DS_Store\n.atom/\n.buildlog/\n.history\n.svn/\n\n# IntelliJ related\n*.iml\n*.ipr\n*.iws\n.idea/\n\n# Visual Studio Code related\n.vscode/\n\n# Flutter/Dart/Pub related\n**/doc/api/\n.dart_tool/\n.flutter-plugins\n.packages\n.pub-cache/\n.pub/\n/build/\n\n# Android related\n**/android/**/gradle-wrapper.jar\n**/android/.gradle\n**/android/captures/\n**/android/gradlew\n**/android/gradlew.bat\n**/android/local.properties\n**/android/**/GeneratedPluginRegistrant.java\n\n# iOS/XCode related\n**/ios/**/*.mode1v3\n**/ios/**/*.mode2v3\n**/ios/**/*.moved-aside\n**/ios/**/*.pbxuser\n**/ios/**/*.perspectivev3\n**/ios/**/*sync/\n**/ios/**/.sconsign.dblite\n**/ios/**/.tags*\n**/ios/**/.vagrant/\n**/ios/**/DerivedData/\n**/ios/**/Icon?\n**/ios/**/Pods/\n**/ios/**/.symlinks/\n**/ios/**/profile\n**/ios/**/xcuserdata\n**/ios/.generated/\n**/ios/Flutter/App.framework\n**/ios/Flutter/Flutter.framework\n**/ios/Flutter/Generated.xcconfig\n**/ios/Flutter/app.flx\n**/ios/Flutter/app.zip\n**/ios/Flutter/flutter_assets/\n**/ios/ServiceDefinitions.json\n**/ios/Runner/GeneratedPluginRegistrant.*\n\n# Exceptions to above rules.\n!**/ios/**/default.mode1v3\n!**/ios/**/default.mode2v3\n!**/ios/**/default.pbxuser\n!**/ios/**/default.perspectivev3\n!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages\n"
  },
  {
    "path": "example/flutter_app_under_test/README.md",
    "content": "# hello_world\n\nA new Flutter project.\n\n## Getting Started\n\nThis project is a starting point for a Flutter application.\n\nA few resources to get you started if this is your first Flutter project:\n\n- [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab)\n- [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook)\n\nFor help getting started with Flutter, view our \n[online documentation](https://flutter.dev/docs), which offers tutorials, \nsamples, guidance on mobile development, and a full API reference.\n"
  },
  {
    "path": "example/flutter_app_under_test/android/app/build.gradle",
    "content": "def localProperties = new Properties()\ndef localPropertiesFile = rootProject.file('local.properties')\nif (localPropertiesFile.exists()) {\n    localPropertiesFile.withReader('UTF-8') { reader ->\n        localProperties.load(reader)\n    }\n}\n\ndef flutterRoot = localProperties.getProperty('flutter.sdk')\nif (flutterRoot == null) {\n    throw new GradleException(\"Flutter SDK not found. Define location with flutter.sdk in the local.properties file.\")\n}\n\ndef flutterVersionCode = localProperties.getProperty('flutter.versionCode')\nif (flutterVersionCode == null) {\n    flutterVersionCode = '1'\n}\n\ndef flutterVersionName = localProperties.getProperty('flutter.versionName')\nif (flutterVersionName == null) {\n    flutterVersionName = '1.0'\n}\n\napply plugin: 'com.android.application'\napply from: \"$flutterRoot/packages/flutter_tools/gradle/flutter.gradle\"\n\nandroid {\n    compileSdkVersion 28\n\n    lintOptions {\n        disable 'InvalidPackage'\n    }\n\n    defaultConfig {\n        // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).\n        applicationId \"com.example.hello_world\"\n        minSdkVersion 16\n        targetSdkVersion 28\n        versionCode flutterVersionCode.toInteger()\n        versionName flutterVersionName\n        testInstrumentationRunner \"android.support.test.runner.AndroidJUnitRunner\"\n    }\n\n    buildTypes {\n        release {\n            // TODO: Add your own signing config for the release build.\n            // Signing with the debug keys for now, so `flutter run --release` works.\n            signingConfig signingConfigs.debug\n        }\n    }\n}\n\nflutter {\n    source '../..'\n}\n\ndependencies {\n    testImplementation 'junit:junit:4.12'\n    androidTestImplementation 'com.android.support.test:runner:1.0.2'\n    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'\n}\n"
  },
  {
    "path": "example/flutter_app_under_test/android/app/src/debug/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.example.hello_world\">\n    <!-- Flutter needs it to communicate with the running application\n         to allow setting breakpoints, to provide hot reload, etc.\n    -->\n    <uses-permission android:name=\"android.permission.INTERNET\"/>\n</manifest>\n"
  },
  {
    "path": "example/flutter_app_under_test/android/app/src/main/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.example.hello_world\">\n\n    <!-- io.flutter.app.FlutterApplication is an android.app.Application that\n         calls FlutterMain.startInitialization(this); in its onCreate method.\n         In most cases you can leave this as-is, but you if you want to provide\n         additional functionality it is fine to subclass or reimplement\n         FlutterApplication and put your custom class here. -->\n    <application\n        android:name=\"io.flutter.app.FlutterApplication\"\n        android:label=\"hello_world\"\n        android:icon=\"@mipmap/ic_launcher\">\n        <activity\n            android:name=\".MainActivity\"\n            android:launchMode=\"singleTop\"\n            android:theme=\"@style/LaunchTheme\"\n            android:configChanges=\"orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode\"\n            android:hardwareAccelerated=\"true\"\n            android:windowSoftInputMode=\"adjustResize\">\n            <!-- This keeps the window background of the activity showing\n                 until Flutter renders its first frame. It can be removed if\n                 there is no splash screen (such as the default splash screen\n                 defined in @style/LaunchTheme). -->\n            <meta-data\n                android:name=\"io.flutter.app.android.SplashScreenUntilFirstFrame\"\n                android:value=\"true\" />\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\"/>\n                <category android:name=\"android.intent.category.LAUNCHER\"/>\n            </intent-filter>\n        </activity>\n    </application>\n</manifest>\n"
  },
  {
    "path": "example/flutter_app_under_test/android/app/src/main/java/com/example/hello_world/MainActivity.java",
    "content": "package com.example.hello_world;\n\nimport android.os.Bundle;\nimport io.flutter.app.FlutterActivity;\nimport io.flutter.plugins.GeneratedPluginRegistrant;\n\npublic class MainActivity extends FlutterActivity {\n  @Override\n  protected void onCreate(Bundle savedInstanceState) {\n    super.onCreate(savedInstanceState);\n    GeneratedPluginRegistrant.registerWith(this);\n  }\n}\n"
  },
  {
    "path": "example/flutter_app_under_test/android/app/src/main/res/drawable/launch_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- Modify this file to customize your launch splash screen -->\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:drawable=\"@android:color/white\" />\n\n    <!-- You can insert your own image assets here -->\n    <!-- <item>\n        <bitmap\n            android:gravity=\"center\"\n            android:src=\"@mipmap/launch_image\" />\n    </item> -->\n</layer-list>\n"
  },
  {
    "path": "example/flutter_app_under_test/android/app/src/main/res/values/styles.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <style name=\"LaunchTheme\" parent=\"@android:style/Theme.Black.NoTitleBar\">\n        <!-- Show a splash screen on the activity. Automatically removed when\n             Flutter draws its first frame -->\n        <item name=\"android:windowBackground\">@drawable/launch_background</item>\n    </style>\n</resources>\n"
  },
  {
    "path": "example/flutter_app_under_test/android/app/src/profile/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.example.hello_world\">\n    <!-- Flutter needs it to communicate with the running application\n         to allow setting breakpoints, to provide hot reload, etc.\n    -->\n    <uses-permission android:name=\"android.permission.INTERNET\"/>\n</manifest>\n"
  },
  {
    "path": "example/flutter_app_under_test/android/build.gradle",
    "content": "buildscript {\n    repositories {\n        google()\n        jcenter()\n    }\n\n    dependencies {\n        classpath 'com.android.tools.build:gradle:3.2.1'\n    }\n}\n\nallprojects {\n    repositories {\n        google()\n        jcenter()\n    }\n}\n\nrootProject.buildDir = '../build'\nsubprojects {\n    project.buildDir = \"${rootProject.buildDir}/${project.name}\"\n}\nsubprojects {\n    project.evaluationDependsOn(':app')\n}\n\ntask clean(type: Delete) {\n    delete rootProject.buildDir\n}\n"
  },
  {
    "path": "example/flutter_app_under_test/android/gradle/wrapper/gradle-wrapper.properties",
    "content": "#Fri Jun 23 08:50:38 CEST 2017\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-4.10.2-all.zip\n"
  },
  {
    "path": "example/flutter_app_under_test/android/gradle.properties",
    "content": "org.gradle.jvmargs=-Xmx1536M\n"
  },
  {
    "path": "example/flutter_app_under_test/android/settings.gradle",
    "content": "include ':app'\n\ndef flutterProjectRoot = rootProject.projectDir.parentFile.toPath()\n\ndef plugins = new Properties()\ndef pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins')\nif (pluginsFile.exists()) {\n    pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) }\n}\n\nplugins.each { name, path ->\n    def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile()\n    include \":$name\"\n    project(\":$name\").projectDir = pluginDirectory\n}\n"
  },
  {
    "path": "example/flutter_app_under_test/ios/Flutter/AppFrameworkInfo.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>CFBundleDevelopmentRegion</key>\n  <string>en</string>\n  <key>CFBundleExecutable</key>\n  <string>App</string>\n  <key>CFBundleIdentifier</key>\n  <string>io.flutter.flutter.app</string>\n  <key>CFBundleInfoDictionaryVersion</key>\n  <string>6.0</string>\n  <key>CFBundleName</key>\n  <string>App</string>\n  <key>CFBundlePackageType</key>\n  <string>FMWK</string>\n  <key>CFBundleShortVersionString</key>\n  <string>1.0</string>\n  <key>CFBundleSignature</key>\n  <string>????</string>\n  <key>CFBundleVersion</key>\n  <string>1.0</string>\n  <key>MinimumOSVersion</key>\n  <string>8.0</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "example/flutter_app_under_test/ios/Flutter/Debug.xcconfig",
    "content": "#include \"Generated.xcconfig\"\n"
  },
  {
    "path": "example/flutter_app_under_test/ios/Flutter/Release.xcconfig",
    "content": "#include \"Generated.xcconfig\"\n"
  },
  {
    "path": "example/flutter_app_under_test/ios/Runner/AppDelegate.h",
    "content": "#import <Flutter/Flutter.h>\n#import <UIKit/UIKit.h>\n\n@interface AppDelegate : FlutterAppDelegate\n\n@end\n"
  },
  {
    "path": "example/flutter_app_under_test/ios/Runner/AppDelegate.m",
    "content": "#include \"AppDelegate.h\"\n#include \"GeneratedPluginRegistrant.h\"\n\n@implementation AppDelegate\n\n- (BOOL)application:(UIApplication *)application\n    didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {\n  [GeneratedPluginRegistrant registerWithRegistry:self];\n  // Override point for customization after application launch.\n  return [super application:application didFinishLaunchingWithOptions:launchOptions];\n}\n\n@end\n"
  },
  {
    "path": "example/flutter_app_under_test/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"size\" : \"20x20\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-20x20@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"20x20\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-20x20@3x.png\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-29x29@1x.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-29x29@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-29x29@3x.png\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"size\" : \"40x40\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-40x40@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"40x40\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-40x40@3x.png\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"size\" : \"60x60\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-60x60@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"60x60\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-60x60@3x.png\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"size\" : \"20x20\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-20x20@1x.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"20x20\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-20x20@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-29x29@1x.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-29x29@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"40x40\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-40x40@1x.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"40x40\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-40x40@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"76x76\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-76x76@1x.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"76x76\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-76x76@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"83.5x83.5\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-83.5x83.5@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"1024x1024\",\n      \"idiom\" : \"ios-marketing\",\n      \"filename\" : \"Icon-App-1024x1024@1x.png\",\n      \"scale\" : \"1x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "example/flutter_app_under_test/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"LaunchImage.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"LaunchImage@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"LaunchImage@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "example/flutter_app_under_test/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md",
    "content": "# Launch Screen Assets\n\nYou can customize the launch screen with your own desired assets by replacing the image files in this directory.\n\nYou can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images."
  },
  {
    "path": "example/flutter_app_under_test/ios/Runner/Base.lproj/LaunchScreen.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"12121\" systemVersion=\"16G29\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" launchScreen=\"YES\" colorMatched=\"YES\" initialViewController=\"01J-lp-oVM\">\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"12089\"/>\n    </dependencies>\n    <scenes>\n        <!--View Controller-->\n        <scene sceneID=\"EHf-IW-A2E\">\n            <objects>\n                <viewController id=\"01J-lp-oVM\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"Ydg-fD-yQy\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"xbc-2k-c8Z\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"Ze5-6b-2t3\">\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <subviews>\n                            <imageView opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" image=\"LaunchImage\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"YRO-k0-Ey4\">\n                            </imageView>\n                        </subviews>\n                        <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                        <constraints>\n                            <constraint firstItem=\"YRO-k0-Ey4\" firstAttribute=\"centerX\" secondItem=\"Ze5-6b-2t3\" secondAttribute=\"centerX\" id=\"1a2-6s-vTC\"/>\n                            <constraint firstItem=\"YRO-k0-Ey4\" firstAttribute=\"centerY\" secondItem=\"Ze5-6b-2t3\" secondAttribute=\"centerY\" id=\"4X2-HB-R7a\"/>\n                        </constraints>\n                    </view>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"iYj-Kq-Ea1\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"53\" y=\"375\"/>\n        </scene>\n    </scenes>\n    <resources>\n        <image name=\"LaunchImage\" width=\"168\" height=\"185\"/>\n    </resources>\n</document>\n"
  },
  {
    "path": "example/flutter_app_under_test/ios/Runner/Base.lproj/Main.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"10117\" systemVersion=\"15F34\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\" initialViewController=\"BYZ-38-t0r\">\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"10085\"/>\n    </dependencies>\n    <scenes>\n        <!--Flutter View Controller-->\n        <scene sceneID=\"tne-QT-ifu\">\n            <objects>\n                <viewController id=\"BYZ-38-t0r\" customClass=\"FlutterViewController\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"y3c-jy-aDJ\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"wfy-db-euE\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"8bC-Xf-vdC\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"600\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"calibratedWhite\"/>\n                    </view>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"dkx-z0-nzr\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n        </scene>\n    </scenes>\n</document>\n"
  },
  {
    "path": "example/flutter_app_under_test/ios/Runner/Info.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\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>hello_world</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>$(FLUTTER_BUILD_NAME)</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>$(FLUTTER_BUILD_NUMBER)</string>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>UILaunchStoryboardName</key>\n\t<string>LaunchScreen</string>\n\t<key>UIMainStoryboardFile</key>\n\t<string>Main</string>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations~ipad</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationPortraitUpsideDown</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>UIViewControllerBasedStatusBarAppearance</key>\n\t<false/>\n</dict>\n</plist>\n"
  },
  {
    "path": "example/flutter_app_under_test/ios/Runner/main.m",
    "content": "#import <Flutter/Flutter.h>\n#import <UIKit/UIKit.h>\n#import \"AppDelegate.h\"\n\nint main(int argc, char* argv[]) {\n  @autoreleasepool {\n    return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));\n  }\n}\n"
  },
  {
    "path": "example/flutter_app_under_test/ios/Runner.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };\n\t\t3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };\n\t\t3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; };\n\t\t3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };\n\t\t9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; };\n\t\t9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };\n\t\t9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB21CF90195004384FC /* Debug.xcconfig */; };\n\t\t978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */; };\n\t\t97C146F31CF9000F007C117D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 97C146F21CF9000F007C117D /* main.m */; };\n\t\t97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };\n\t\t97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };\n\t\t97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXCopyFilesBuildPhase section */\n\t\t9705A1C41CF9048500538489 /* Embed Frameworks */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 10;\n\t\t\tfiles = (\n\t\t\t\t3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */,\n\t\t\t\t9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */,\n\t\t\t);\n\t\t\tname = \"Embed Frameworks\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXCopyFilesBuildPhase section */\n\n/* Begin PBXFileReference section */\n\t\t1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = \"<group>\"; };\n\t\t1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = \"<group>\"; };\n\t\t3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = \"<group>\"; };\n\t\t3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = \"<group>\"; };\n\t\t7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = \"<group>\"; };\n\t\t7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = \"<group>\"; };\n\t\t7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = \"<group>\"; };\n\t\t9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = \"<group>\"; };\n\t\t9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = \"<group>\"; };\n\t\t9740EEBA1CF902C7004384FC /* Flutter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Flutter.framework; path = Flutter/Flutter.framework; sourceTree = \"<group>\"; };\n\t\t97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t97C146F21CF9000F007C117D /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = \"<group>\"; };\n\t\t97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = \"<group>\"; };\n\t\t97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = \"<group>\"; };\n\t\t97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = \"<group>\"; };\n\t\t97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t97C146EB1CF9000F007C117D /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */,\n\t\t\t\t3B80C3941E831B6300D905FE /* App.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t9740EEB11CF90186004384FC /* Flutter */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t3B80C3931E831B6300D905FE /* App.framework */,\n\t\t\t\t3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,\n\t\t\t\t9740EEBA1CF902C7004384FC /* Flutter.framework */,\n\t\t\t\t9740EEB21CF90195004384FC /* Debug.xcconfig */,\n\t\t\t\t7AFA3C8E1D35360C0083082E /* Release.xcconfig */,\n\t\t\t\t9740EEB31CF90195004384FC /* Generated.xcconfig */,\n\t\t\t);\n\t\t\tname = Flutter;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t97C146E51CF9000F007C117D = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t9740EEB11CF90186004384FC /* Flutter */,\n\t\t\t\t97C146F01CF9000F007C117D /* Runner */,\n\t\t\t\t97C146EF1CF9000F007C117D /* Products */,\n\t\t\t\tCF3B75C9A7D2FA2A4C99F110 /* Frameworks */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t97C146EF1CF9000F007C117D /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t97C146EE1CF9000F007C117D /* Runner.app */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t97C146F01CF9000F007C117D /* Runner */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */,\n\t\t\t\t7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */,\n\t\t\t\t97C146FA1CF9000F007C117D /* Main.storyboard */,\n\t\t\t\t97C146FD1CF9000F007C117D /* Assets.xcassets */,\n\t\t\t\t97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,\n\t\t\t\t97C147021CF9000F007C117D /* Info.plist */,\n\t\t\t\t97C146F11CF9000F007C117D /* Supporting Files */,\n\t\t\t\t1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,\n\t\t\t\t1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,\n\t\t\t);\n\t\t\tpath = Runner;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t97C146F11CF9000F007C117D /* Supporting Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t97C146F21CF9000F007C117D /* main.m */,\n\t\t\t);\n\t\t\tname = \"Supporting Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t97C146ED1CF9000F007C117D /* Runner */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget \"Runner\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t9740EEB61CF901F6004384FC /* Run Script */,\n\t\t\t\t97C146EA1CF9000F007C117D /* Sources */,\n\t\t\t\t97C146EB1CF9000F007C117D /* Frameworks */,\n\t\t\t\t97C146EC1CF9000F007C117D /* Resources */,\n\t\t\t\t9705A1C41CF9048500538489 /* Embed Frameworks */,\n\t\t\t\t3B06AD1E1E4923F5004D2608 /* Thin Binary */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = Runner;\n\t\t\tproductName = Runner;\n\t\t\tproductReference = 97C146EE1CF9000F007C117D /* Runner.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t97C146E61CF9000F007C117D /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastUpgradeCheck = 0910;\n\t\t\t\tORGANIZATIONNAME = \"The Chromium Authors\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t97C146ED1CF9000F007C117D = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.3.1;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject \"Runner\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 97C146E51CF9000F007C117D;\n\t\t\tproductRefGroup = 97C146EF1CF9000F007C117D /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t97C146ED1CF9000F007C117D /* Runner */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t97C146EC1CF9000F007C117D /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,\n\t\t\t\t3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,\n\t\t\t\t9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */,\n\t\t\t\t97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,\n\t\t\t\t97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXShellScriptBuildPhase section */\n\t\t3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\tname = \"Thin Binary\";\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"/bin/sh \\\"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\\\" thin\";\n\t\t};\n\t\t9740EEB61CF901F6004384FC /* Run Script */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\tname = \"Run Script\";\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"/bin/sh \\\"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\\\" build\";\n\t\t};\n/* End PBXShellScriptBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t97C146EA1CF9000F007C117D /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */,\n\t\t\t\t97C146F31CF9000F007C117D /* main.m in Sources */,\n\t\t\t\t1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXVariantGroup section */\n\t\t97C146FA1CF9000F007C117D /* Main.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t97C146FB1CF9000F007C117D /* Base */,\n\t\t\t);\n\t\t\tname = Main.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t97C147001CF9000F007C117D /* Base */,\n\t\t\t);\n\t\t\tname = LaunchScreen.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t249021D3217E4FDB00AE95B9 /* Profile */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Profile;\n\t\t};\n\t\t249021D4217E4FDB00AE95B9 /* Profile */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCURRENT_PROJECT_VERSION = \"$(FLUTTER_BUILD_NUMBER)\";\n\t\t\t\tDEVELOPMENT_TEAM = S8QB4VV633;\n\t\t\t\tENABLE_BITCODE = NO;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Flutter\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = Runner/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tLIBRARY_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Flutter\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.example.helloWorld;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t};\n\t\t\tname = Profile;\n\t\t};\n\t\t97C147031CF9000F007C117D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t97C147041CF9000F007C117D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t97C147061CF9000F007C117D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCURRENT_PROJECT_VERSION = \"$(FLUTTER_BUILD_NUMBER)\";\n\t\t\t\tENABLE_BITCODE = NO;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Flutter\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = Runner/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tLIBRARY_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Flutter\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.example.helloWorld;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t97C147071CF9000F007C117D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCURRENT_PROJECT_VERSION = \"$(FLUTTER_BUILD_NUMBER)\";\n\t\t\t\tENABLE_BITCODE = NO;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Flutter\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = Runner/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tLIBRARY_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Flutter\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.example.helloWorld;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t97C146E91CF9000F007C117D /* Build configuration list for PBXProject \"Runner\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t97C147031CF9000F007C117D /* Debug */,\n\t\t\t\t97C147041CF9000F007C117D /* Release */,\n\t\t\t\t249021D3217E4FDB00AE95B9 /* Profile */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget \"Runner\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t97C147061CF9000F007C117D /* Debug */,\n\t\t\t\t97C147071CF9000F007C117D /* Release */,\n\t\t\t\t249021D4217E4FDB00AE95B9 /* Profile */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 97C146E61CF9000F007C117D /* Project object */;\n}\n"
  },
  {
    "path": "example/flutter_app_under_test/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"group:Runner.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "example/flutter_app_under_test/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0910\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"97C146ED1CF9000F007C117D\"\n               BuildableName = \"Runner.app\"\n               BlueprintName = \"Runner\"\n               ReferencedContainer = \"container:Runner.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      language = \"\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"97C146ED1CF9000F007C117D\"\n            BuildableName = \"Runner.app\"\n            BlueprintName = \"Runner\"\n            ReferencedContainer = \"container:Runner.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      language = \"\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"97C146ED1CF9000F007C117D\"\n            BuildableName = \"Runner.app\"\n            BlueprintName = \"Runner\"\n            ReferencedContainer = \"container:Runner.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Profile\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"97C146ED1CF9000F007C117D\"\n            BuildableName = \"Runner.app\"\n            BlueprintName = \"Runner\"\n            ReferencedContainer = \"container:Runner.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "example/flutter_app_under_test/ios/Runner.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"group:Runner.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "example/flutter_app_under_test/lib/main.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter_driver/driver_extension.dart';\nimport 'package:functional_widget_annotation/functional_widget_annotation.dart';\nimport 'package:hello_world/stream.dart';\n\npart 'main.g.dart';\n\nvoid main() {\n  enableFlutterDriverExtension();\n  init();\n  runApp(MyApp());\n}\n\n@widget\nWidget myApp() => MaterialApp(\n  title: 'Counter App',\n  home: MyHomePage(title: 'Counter App Home Page'),\n);\n\n\n\n@widget\nWidget myHomePage(BuildContext context, {String title}) => Scaffold(\n  appBar: AppBar(\n    title: Text(title),\n  ),\n  body: Center(\n    child: Column(\n      mainAxisAlignment: MainAxisAlignment.center,\n      children: <Widget>[\n        Text(\n          'You have pushed the button this many times:',\n        ),\n        Tooltip(\n          message: 'counter_tooltip',\n          child: StreamBuilder<int>(\n            stream: counterStream,\n            builder: (context, snapshot) {\n              return Text(\n                '${snapshot.data}',\n                key: Key('counter'),\n                style: Theme.of(context).textTheme.display1,\n                semanticsLabel: 'counter_semantic',\n              );\n            }\n          ),\n        ),\n        FlatButton(\n          onPressed: () {\n            Navigator.push(\n              context,\n              MaterialPageRoute(\n                  builder: (context) => Scaffold(\n                        appBar: AppBar(\n                          title: Text(\"Second Route\"),\n                        ),\n                        body: Center(\n                          child: SecondPage(),\n                        ),\n                      )),\n            );\n          },\n          child: Text(\n            'Go to next route',\n            key: Key('next_route_key'),\n          ),\n        ),\n      ],\n    ),\n  ),\n  floatingActionButton: FloatingActionButton(\n    // Provide a Key to this button. This allows finding this\n    // specific button inside the test suite, and tapping it.\n    key: Key('increment'),\n    onPressed: () => plusClickSink.add(null),\n    tooltip: 'Increment',\n    child: Icon(Icons.add),\n  ),\n);\n\n@widget\nWidget secondPage() => ListView(\n  padding: const EdgeInsets.all(8.0),\n  children: <Widget>[\n    Container(\n      height: 100,\n      color: Colors.amber[600],\n      child: const Center(child: Text('This is 2nd route')),\n    ),\n    Container(\n      height: 200,\n      color: Colors.amber[500],\n      child: const Center(child: Text('Entry B')),\n    ),\n    Container(\n      height: 500,\n      color: Colors.amber[100],\n      child: const Center(child: Text('Entry C')),\n    ),\n    Container(\n      height: 1000,\n      color: Colors.amber[100],\n      child: const Center(child: Text('Entry D')),\n    ),\n    Container(\n      height: 1000,\n      color: Colors.amber[100],\n      child: const Center(\n          child: TextField(\n        decoration: InputDecoration(\n          border: OutlineInputBorder(),\n          labelText: 'Sample Input',\n        ),\n      )),\n    ),\n  ],\n);\n"
  },
  {
    "path": "example/flutter_app_under_test/lib/main.g.dart",
    "content": "// GENERATED CODE - DO NOT MODIFY BY HAND\n\npart of 'main.dart';\n\n// **************************************************************************\n// FunctionalWidgetGenerator\n// **************************************************************************\n\nclass MyApp extends StatelessWidget {\n  const MyApp({Key key}) : super(key: key);\n\n  @override\n  Widget build(BuildContext _context) => myApp();\n}\n\nclass MyHomePage extends StatelessWidget {\n  const MyHomePage({Key key, this.title}) : super(key: key);\n\n  final String title;\n\n  @override\n  Widget build(BuildContext _context) => myHomePage(_context, title: title);\n}\n\nclass SecondPage extends StatelessWidget {\n  const SecondPage({Key key}) : super(key: key);\n\n  @override\n  Widget build(BuildContext _context) => secondPage();\n}\n"
  },
  {
    "path": "example/flutter_app_under_test/lib/stream.dart",
    "content": "import 'dart:async' show StreamSink;\n\nimport 'package:rxdart/rxdart.dart'\n    show BehaviorSubject;\n\nfinal counterSubject = new BehaviorSubject<int>.seeded(0);\nfinal counterStream = counterSubject.stream;\n\nfinal plusClickSubject = new BehaviorSubject<void>();\nfinal StreamSink plusClickSink = plusClickSubject;\n\nvoid init() {\n  plusClickSubject.stream.withLatestFrom<int, int>(\n    counterSubject,\n    (_, a) => a + 1,\n  ).pipe(counterSubject);\n}\n"
  },
  {
    "path": "example/flutter_app_under_test/pubspec.yaml",
    "content": "name: hello_world\ndescription: A new Flutter project.\nversion: 1.0.0+1\n\nenvironment:\n  sdk: \">=2.1.0 <3.0.0\"\n\ndependencies:\n  functional_widget_annotation: ^0.5.0\n  rxdart: 0.22.1+1\n  flutter:\n    sdk: flutter\n\ndev_dependencies:\n  test: any\n  flutter_test:\n    sdk: flutter\n  flutter_driver:\n    sdk: flutter\n\nflutter:\n  uses-material-design: true\n\nbuilders:\n  functional_widget: ^0.6.0"
  },
  {
    "path": "example/flutter_app_under_test/test/widget_test.dart",
    "content": "// This is a basic Flutter widget test.\n//\n// To perform an interaction with a widget in your test, use the WidgetTester\n// utility that Flutter provides. For example, you can send tap and scroll\n// gestures. You can also use WidgetTester to find child widgets in the widget\n// tree, read text, and verify that the values of widget properties are correct.\n\nimport 'package:flutter/material.dart';\nimport 'package:flutter_test/flutter_test.dart';\n\nimport 'package:hello_world/main.dart';\n\nvoid main() {\n  testWidgets('Counter increments smoke test', (WidgetTester tester) async {\n    // Build our app and trigger a frame.\n    await tester.pumpWidget(MyApp());\n\n    // Verify that our counter starts at 0.\n    expect(find.text('0'), findsOneWidget);\n    expect(find.text('1'), findsNothing);\n\n    // Tap the '+' icon and trigger a frame.\n    await tester.tap(find.byIcon(Icons.add));\n    await tester.pump();\n\n    // Verify that our counter has incremented.\n    expect(find.text('0'), findsNothing);\n    expect(find.text('1'), findsOneWidget);\n  });\n}\n"
  },
  {
    "path": "example/flutter_app_under_test/test_driver/main_test.dart",
    "content": "// Imports the Flutter Driver API.\nimport 'package:flutter_driver/flutter_driver.dart';\nimport 'package:test/test.dart';\n\nvoid main() {\n  group('Counter App', () {\n    // First, define the Finders and use them to locate widgets from the\n    // test suite. Note: the Strings provided to the `byValueKey` method must\n    // be the same as the Strings we used for the Keys in step 1.\n    final counterTextFinder = find.byValueKey('counter');\n    final buttonFinder = find.byValueKey('increment');\n\n    FlutterDriver driver;\n\n    // Connect to the Flutter driver before running any tests.\n    setUpAll(() async {\n      driver = await FlutterDriver.connect(\n        printCommunication: true,\n      );\n    });\n\n    // Close the connection to the driver after the tests have completed.\n    tearDownAll(() async {\n      if (driver != null) {\n        driver.close();\n      }\n    });\n\n    test('starts at 0', () async {\n      final h = await driver.checkHealth();\n      expect(h.status, HealthStatus.ok);\n      await driver.clearTimeline();\n      final renderObject = await driver.getRenderObjectDiagnostics(counterTextFinder, subtreeDepth: 2, includeProperties: true);\n      \n      // Use the `driver.getText` method to verify the counter starts at 0.\n      expect(await driver.getText(counterTextFinder), \"0\");\n      await driver.getBottomLeft(counterTextFinder);\n      await driver.getTopRight(counterTextFinder);\n    });\n\n    test('increments the counter', () async {\n      // First, tap the button.\n      await driver.tap(buttonFinder);\n      await driver.tap(buttonFinder);\n\n      // Then, verify the counter text is incremented by 1.\n      expect(await driver.getText(counterTextFinder), \"2\");\n    });\n\n    test(' ', () async {\n      await driver.tap(find.byTooltip('Increment'));\n      expect(\n          await driver.getText(find.descendant(\n              of: find.byTooltip('counter_tooltip'),\n              matching: find.byValueKey('counter'))),\n          '3');\n\n      await driver.tap(find.byType('FlatButton'));\n      await driver.waitForAbsent(find.byTooltip('counter_tooltip'));\n      expect(await driver.getText(find.text('This is 2nd route')),\n          'This is 2nd route');\n      await driver.scrollUntilVisible(find.byType('ListView'), find.byType('TextField'), dxScroll: 90, dyScroll: -400);\n      await driver.scroll(find.byType('ListView'), 50, 100, Duration(milliseconds: 200), frequency: 30);\n      await driver.scrollIntoView(find.byType('ListView'), alignment: 1.4);\n      await driver.tap(find.byType('TextField'));\n      await driver.enterText('I can enter text');\n      await driver.waitFor(find.text('I can enter text'));  // verify text appears on UI\n\n      await driver.tap(find.pageBack());\n      await driver.waitFor(find.byTooltip('counter_tooltip'));\n      expect(\n          await driver.getText(\n            find.descendant(\n              of: find.ancestor(\n                  of: find.bySemanticsLabel(RegExp('counter_semantic')),\n                  matching: find.byType('Tooltip')),\n              matching: find.byType('Text'),\n            ),\n          ),\n          '3');\n    });\n  });\n}\n"
  },
  {
    "path": "example/java/.gitignore",
    "content": "target/*\n.settings/*\n.classpath\n.project\n"
  },
  {
    "path": "example/java/.vscode/settings.json",
    "content": "{\n  \"java.configuration.updateBuildConfiguration\": \"automatic\"\n}"
  },
  {
    "path": "example/java/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\t<groupId>com.saucelabs</groupId>\n\t<artifactId>sauce_appium_junit</artifactId>\n\t<version>0.0.1-SNAPSHOT</version>\n\t<name>sauce_appium_junit</name>\n\t<description>Sample Appium tests using JUnit</description>\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>junit</groupId>\n\t\t\t<artifactId>junit</artifactId>\n\t\t\t<version>4.13.1</version>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n        <dependency>\n            <groupId>io.appium</groupId>\n            <artifactId>java-client</artifactId>\n            <version>5.0.0-BETA8</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>com.googlecode.json-simple</groupId>\n\t\t\t<artifactId>json-simple</artifactId>\n\t\t\t<version>1.1</version>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>commons-lang</groupId>\n\t\t\t<artifactId>commons-lang</artifactId>\n\t\t\t<version>2.6</version>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\t\t<!-- Includes the Sauce JUnit helper libraries -->\n\t\t<dependency>\n\t\t\t<groupId>com.saucelabs</groupId>\n\t\t\t<artifactId>sauce_junit</artifactId>\n\t\t\t<version>2.1.23</version>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>com.google.code.gson</groupId>\n\t\t\t<artifactId>gson</artifactId>\n\t\t\t<version>2.8.9</version>\n    </dependency>\n    \n    <dependency>\n\t\t<groupId>io.appium</groupId>\n\t\t<artifactId>java-client</artifactId>\n\t\t<version>4.1.2</version>\n\t</dependency>\n\t<dependency>\n\t\t<groupId>com.github.appium</groupId>\n\t\t<artifactId>appium-flutter-driver</artifactId>\n\t\t<version>main-SNAPSHOT</version>\n\t</dependency>\n\n  </dependencies>\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-surefire-plugin</artifactId>\n\t\t\t</plugin>\n\t\t\t<plugin>\n\t\t\t\t<artifactId>maven-compiler-plugin</artifactId>\n\t\t\t\t<configuration>\n\t\t\t\t\t<source>1.8</source>\n\t\t\t\t\t<target>1.8</target>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\n\t<repositories>\n\t\t<repository>\n\t\t\t<id>saucelabs-repository</id>\n\t\t\t<url>https://repository-saucelabs.forge.cloudbees.com/release</url>\n\t\t\t<releases>\n\t\t\t\t<enabled>true</enabled>\n\t\t\t</releases>\n\t\t\t<snapshots>\n\t\t\t\t<enabled>true</enabled>\n\t\t\t</snapshots>\n\t\t</repository>\n\t\t<repository>\n\t\t\t<id>jitpack.io</id>\n\t\t\t<url>https://jitpack.io</url>\n\t\t</repository>\n\t</repositories>\n</project>\n"
  },
  {
    "path": "example/java/src/test/java/example/appium/BaseDriver.java",
    "content": "package example.appium;\n\nimport io.appium.java_client.AppiumDriver;\nimport io.appium.java_client.MobileElement;\nimport io.appium.java_client.ios.IOSDriver;\nimport io.appium.java_client.service.local.AppiumDriverLocalService;\nimport io.appium.java_client.service.local.AppiumServerHasNotBeenStartedLocallyException;\nimport org.junit.After;\nimport org.junit.Before;\nimport org.openqa.selenium.remote.DesiredCapabilities;\nimport org.openqa.selenium.support.ui.WebDriverWait;\n\nimport java.io.File;\n\npublic class BaseDriver {\n  public AppiumDriver<MobileElement> driver;\n  public WebDriverWait wait;\n  private static AppiumDriverLocalService service;\n\n  @Before\n  public void setUp() throws Exception {\n    service = AppiumDriverLocalService.buildDefaultService();\n    service.start();\n\n    if (service == null || !service.isRunning()) {\n      throw new AppiumServerHasNotBeenStartedLocallyException(\"An appium server node is not started!\");\n    }\n\n    DesiredCapabilities capabilities = new DesiredCapabilities();\n    capabilities.setCapability(\"platformVersion\", \"12.2\");\n    capabilities.setCapability(\"deviceName\", \"iPhone X\");\n    capabilities.setCapability(\"noReset\", true);\n\n    File classpathRoot = new File(System.getProperty(\"user.dir\"));\n    File appDir = new File(classpathRoot, \"/../apps\");\n    File app = new File(appDir.getCanonicalPath(), \"ios-sim-debug.zip\");\n\n    System.out.println(app.getAbsolutePath());\n    capabilities.setCapability(\"app\", app.getAbsolutePath());\n\n    capabilities.setCapability(\"automationName\", \"Flutter\");\n\n    driver = new IOSDriver<MobileElement>(service.getUrl(), capabilities);\n    wait = new WebDriverWait(driver, 10);\n    waitForFirstFrame();\n  }\n\n  @After\n  public void tearDown() throws Exception {\n    if (driver != null) {\n      driver.quit();\n    }\n    if (service != null) {\n      service.stop();\n    }\n  }\n\n  public void waitForFirstFrame(){\n        driver.executeScript(\"flutter:waitForFirstFrame\");\n    }\n}\n"
  },
  {
    "path": "example/java/src/test/java/example/appium/FlutterTest.java",
    "content": "package example.appium;\n\nimport org.junit.Before;\nimport org.junit.Test;\nimport static org.junit.Assert.assertEquals;\n\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.regex.Pattern;\nimport java.io.File;\n\nimport org.openqa.selenium.OutputType;\nimport io.appium.java_client.MobileElement;\nimport pro.truongsinh.appium_flutter.FlutterFinder;\nimport pro.truongsinh.appium_flutter.finder.FlutterElement;\n\npublic class FlutterTest extends BaseDriver {\n  protected FlutterFinder find;\n  @Before\n  public void setUp() throws Exception {\n    super.setUp();\n    find = new FlutterFinder(driver);\n  }\n\n  @Test\n  public void basicTest () throws InterruptedException {\n    String buttonFinderKey = \"increment\";\n    FlutterElement counterTextFinder = find.byValueKey(\"counter\");\n    MobileElement buttonFinder = waitFor(buttonFinderKey);\n\n    validateElementPosition(buttonFinder);\n\n    assertEquals(driver.executeScript(\"flutter:checkHealth\"), \"ok\");\n    driver.executeScript(\"flutter:clearTimeline\");\n    driver.executeScript(\"flutter:forceGC\");\n    \n    Map renderObjectDiagnostics = (Map) driver.executeScript(\n      \"flutter:getRenderObjectDiagnostics\",\n      counterTextFinder.getId(),\n      new HashMap<String, Object>() {{\n        put(\"includeProperties\", true);\n        put(\"subtreeDepth\", 2);\n      }}\n    );\n\n    assertEquals(renderObjectDiagnostics.get(\"type\"), \"DiagnosticableTreeNode\");\n    assertEquals(((List)renderObjectDiagnostics.get(\"children\")).size(), 1);\n\n    Object semanticsId = driver.executeScript(\n      \"flutter:getSemanticsId\",\n      counterTextFinder\n    );\n    assertEquals(semanticsId, 4L);\n\n    String treeString = (String) driver.executeScript(\"flutter: getRenderTree\");\n    assertEquals(treeString.substring(0, 11), \"RenderView#\");\n\n\n    driver.context(\"NATIVE_APP\");\n    File f1 = driver.getScreenshotAs(OutputType.FILE);\n    f1.renameTo(new File(\"./native-screenshot.png\"));\n    driver.context(\"FLUTTER\");\n    File f2 = driver.getScreenshotAs(OutputType.FILE);\n    f2.renameTo(new File(\"./flutter-screenshot.png\"));\n\n    assertEquals(counterTextFinder.getText(), \"0\");\n\n    clickToElement(buttonFinderKey);\n    // @todo tap not working?\n    // buttonFinder.tap(1, 100);\n    clickToElement(buttonFinderKey);\n    assertEquals(counterTextFinder.getText(), \"2\");\n\n    find.byTooltip(\"Increment\").click();\n\n    assertEquals(find.descendant(find.byTooltip(\"counter_tooltip\"), find.byValueKey(\"counter\"), false, false).getText(), \"3\");\n    \n    find.byType(\"FlatButton\").click();\n    driver.executeScript(\"flutter:waitForAbsent\", buttonFinder);\n\n    assertEquals(find.text(\"This is 2nd route\").getText(), \"This is 2nd route\");\n\n    driver.executeScript(\"flutter:scrollUntilVisible\", find.byType(\"ListView\"), new HashMap<String, Object>() {{\n      put(\"item\", find.byType(\"TextField\"));\n      put(\"dxScroll\", 90);\n      put(\"dyScroll\", -400);\n    }});\n\n    driver.executeScript(\"flutter:scroll\", find.byType(\"ListView\"), new HashMap<String, Object>() {{\n      put(\"item\", find.byType(\"TextField\"));\n      put(\"dx\", 50);\n      put(\"dy\", 100);\n      put(\"durationMilliseconds\", 200);\n      put(\"frequency\", 30);\n    }});\n    \n    driver.executeScript(\"flutter:scrollIntoView\", find.byType(\"ListView\"), new HashMap<String, Object>() {{\n      put(\"alignment\", 0.1);\n    }});\n\n    find.byType(\"TextField\").sendKeys(\"I can enter text\"); // enter text\n    driver.executeScript(\"flutter:waitFor\", find.text(\"I can enter text\")); // verify text appears on UI\n\n    find.pageBack().click();\n    driver.executeScript(\"flutter:waitFor\", buttonFinder);\n\n    find.descendant(\n      find.ancestor(\n        find.bySemanticsLabel(Pattern.compile(\"counter_semantic\")),\n        find.byType(\"Tooltip\"), false, false\n        ),\n      find.byType(\"Text\"), false, false\n      )\n      .click()\n      ;\n \n    driver.quit();\n  }\n\n  private void clickToElement(String locator){\n    MobileElement el = waitFor(locator);\n    el.click();\n  }\n\n  private MobileElement waitFor(String locator){\n     return (MobileElement) driver.executeScript(\"flutter:waitFor\", find.byValueKey(locator), 30);\n  }\n\n  private void validateElementPosition(MobileElement buttonFinder) {\n    Map bottomLeft = (Map) driver.executeScript(\"flutter:getBottomLeft\", buttonFinder);\n    assertEquals(bottomLeft.get(\"dx\") instanceof Long, true);\n    assertEquals(bottomLeft.get(\"dy\") instanceof Long, true);\n\n    Map bottomRight = (Map) driver.executeScript(\"flutter:getBottomRight\", buttonFinder);\n    assertEquals(bottomRight.get(\"dx\") instanceof Long, true);\n    assertEquals(bottomRight.get(\"dy\") instanceof Long, true);\n\n    Map center = (Map) driver.executeScript(\"flutter:getCenter\", buttonFinder);\n    assertEquals(center.get(\"dx\") instanceof Long, true);\n    assertEquals(center.get(\"dy\") instanceof Long, true);\n\n    Map topLeft = (Map) driver.executeScript(\"flutter:getTopLeft\", buttonFinder);\n    assertEquals(topLeft.get(\"dx\") instanceof Long, true);\n    assertEquals(topLeft.get(\"dy\") instanceof Long, true);\n\n    Map topRight = (Map) driver.executeScript(\"flutter:getTopRight\", buttonFinder);\n    assertEquals(topRight.get(\"dx\") instanceof Long, true);\n    assertEquals(topRight.get(\"dy\") instanceof Long, true);\n  }\n}\n"
  },
  {
    "path": "example/nodejs/README.md",
    "content": "# To run the automation locally\n\n1. Make sure node and npm are installed locally\n2. cd to ./driver\n3. `npm install -g typescript` for typescript compile to work globally\n4. `npm install` to install node modules\n5. run `npm link`\n6. install Appium globally by running `npm i -g appium`\n7. run appium server by running `appium` (in a seperate terminal)\n\n8. create a dir called `apps`, and put example files as download from https://github.com/truongsinh/appium-flutter-driver/releases/tag/v0.0.4 into that dir:\n- (Android) https://github.com/truongsinh/appium-flutter-driver/releases/download/v0.0.4/android-real-debug.apk\n- (iOS) https://github.com/truongsinh/appium-flutter-driver/releases/download/v0.0.4/ios-sim-debug.zip\n\n9. Modify the path for apk/ipa appropriately at https://github.com/appium/appium-flutter-driver/blob/main/example/nodejs/src/index.js#L13\n\n10. either run `APPIUM_OS=android npm start` or `APPIUM_OS=ios npm start`\n"
  },
  {
    "path": "example/nodejs/package.json",
    "content": "{\n  \"name\": \"appium\",\n  \"version\": \"1.0.0\",\n  \"description\": \"\",\n  \"main\": \"index.js\",\n  \"dependencies\": {\n    \"appium-flutter-finder\": \"^0.2.0\",\n    \"webdriverio\": \"^9.0.1\"\n  },\n  \"scripts\": {\n    \"start\": \"node src/index.js\",\n    \"ios\": \"APPIUM_OS=ios npm start\",\n    \"android\": \"APPIUM_OS=android npm start\",\n    \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"\n  },\n  \"author\": \"TruongSinh Tran-Nguyen <i@truongsinh.pro\",\n  \"private\": true,\n  \"license\": \"MIT\"\n}\n"
  },
  {
    "path": "example/nodejs/src/index.js",
    "content": "// import * as wdio from 'webdriverio';\n// import * as assert from 'assert';\nconst wdio = require('webdriverio');\nconst assert = require('assert');\nconst find = require('appium-flutter-finder');\n\nconst osSpecificOps =\n  process.env.APPIUM_OS === 'android'\n    ? {\n        'appium:platformName': 'Android',\n        'appium:deviceName': 'Pixel 2',\n        // @todo support non-unix style path\n        'appium:app': __dirname + '/../../apps/android-real-debug.apk' // download local to run faster and save bandwidth\n        // app: 'https://github.com/truongsinh/appium-flutter-driver/releases/download/v0.0.4/android-real-debug.apk',\n      }\n    : process.env.APPIUM_OS === 'ios'\n    ? {\n        'appium:platformName': 'iOS',\n        'appium:platformVersion': '15.5',\n        'appium:deviceName': 'iPhone 13',\n        'appium:connectionRetryTimeout': 60000,\n        'appium:noReset': true,\n        'appium:app': __dirname + '/../../apps/ios-sim-debug.zip' // download local to run faster and save bandwidth\n        // app: 'https://github.com/truongsinh/appium-flutter-driver/releases/download/v0.0.4/ios-sim-debug.zip',\n      }\n    : {};\n\nconst opts = {\n  port: 4723,\n  path: '/wd/hub',\n  capabilities: {\n    ...osSpecificOps,\n    'appium:automationName': 'Flutter'\n  }\n};\n\n(async () => {\n  const counterTextFinder = find.byValueKey('counter');\n  const buttonFinder = find.byValueKey('increment');\n\n  const driver = await wdio.remote(opts);\n\n  await validateElementPosition(driver, buttonFinder);\n\n  assert.strictEqual(await driver.execute('flutter:checkHealth'), 'ok');\n  await driver.execute('flutter:clearTimeline');\n  await driver.execute('flutter:forceGC');\n\n  const renderObjectDiagnostics = await driver.execute(\n    'flutter:getRenderObjectDiagnostics',\n    counterTextFinder,\n    { includeProperties: true, subtreeDepth: 2 }\n  );\n  assert.strictEqual(renderObjectDiagnostics.type, 'DiagnosticableTreeNode');\n  assert.strictEqual(renderObjectDiagnostics.children.length, 1);\n\n  const semanticsId = await driver.execute(\n    'flutter:getSemanticsId',\n    counterTextFinder\n  );\n  assert.strictEqual(semanticsId, 4);\n\n  const treeString = await driver.execute('flutter: getRenderTree');\n  assert.strictEqual(treeString.substr(0, 11), 'RenderView#');\n\n  await driver.switchContext('NATIVE_APP');\n  await driver.saveScreenshot('./native-screenshot.png');\n  await driver.switchContext('FLUTTER');\n  await driver.saveScreenshot('./flutter-screenshot.png');\n\n  /* new example\n  if (process.env.APPIUM_OS === 'android') {\n    await driver.switchContext('NATIVE_APP');\n    await (await driver.$('~fab')).click();\n    await driver.switchContext('FLUTTER');\n  } else {\n    console.log(\n      'Switching context to `NATIVE_APP` is currently only applicable to Android demo app.'\n    );\n  }\n  */\n\n  assert.strictEqual(await driver.getElementText(counterTextFinder), '0');\n\n  //Long Press using flutter command on Increment button, it should visible 'increment' tooltip after longTap\n  await driver.execute('flutter:longTap', find.byValueKey('increment'), {durationMilliseconds: 10000, frequency: 30});\n\n  //Long Press using TouchAction with wait\n  await driver.touchAction([\n    {\n     action: 'longPress',\n     element: { elementId: buttonFinder }\n    },\n    {\n     action: 'wait',\n     ms: 10000\n    },\n    {\n     action: 'release'\n    }\n  ]);\n\n  //Long Press using TouchAction without wait\n  await driver.touchAction([\n    {\n     action: 'longPress',\n     element: { elementId: buttonFinder }\n    },\n    {\n     action: 'release'\n    }\n  ]);\n\n  //Long Press using TouchAction without wait and release\n  await driver.touchAction([\n    {\n     action: 'longPress',\n     element: { elementId: buttonFinder }\n    },\n  ]);\n\n  await driver.saveScreenshot('./flutter-longPress.png');\n\n  await driver.elementClick(buttonFinder);\n  await driver.touchAction({\n    action: 'tap',\n    element: { elementId: buttonFinder }\n  });\n\n  assert.strictEqual(await driver.getElementText(counterTextFinder), '2');\n\n  await driver.elementClick(find.byTooltip('Increment'));\n\n  assert.strictEqual(\n    await driver.getElementText(\n      find.descendant({\n        of: find.byTooltip('counter_tooltip'),\n        matching: find.byValueKey('counter')\n      })\n    ),\n    '3'\n  );\n\n  await driver.elementClick(find.byType('FlatButton'));\n\n  let firstWaitForAbsentError;\n  try {\n    await driver.execute('flutter:waitForAbsent', buttonFinder, {durationMilliseconds: 1});\n  } catch(e) {\n    firstWaitForAbsentError = e;\n  } finally {\n    // @todo\n  }\n\n  try {\n    await driver.execute('flutter:waitForAbsent', buttonFinder, {durationMilliseconds: 'malformed input'});\n  } catch(e) {\n    firstWaitForAbsentError = e;\n  } finally {\n    // @todo\n  }\n\n  await driver.execute('flutter:waitForAbsent', buttonFinder);\n\n  assert.strictEqual(\n    await driver.getElementText(find.byText('This is 2nd route')),\n    'This is 2nd route'\n  );\n\n  await driver.execute('flutter:scrollUntilVisible', find.byType('ListView'), {item:find.byType('TextField'), dxScroll: 90, dyScroll: -400});\n  await driver.execute('flutter:scroll', find.byType('ListView'), {dx: 50, dy: 100, durationMilliseconds: 200, frequency: 30});\n  await driver.execute('flutter:scrollIntoView', find.byType('TextField'), {alignment: 0.1});\n  await driver.elementSendKeys(find.byType('TextField'), 'I can enter text');\n  await driver.execute('flutter:waitFor', find.byText('I can enter text')); // verify text appears on UI\n  await driver.elementClear(find.byType('TextField')); //It can Clear the text field\n\n  await driver.elementClick(find.pageBack());\n  await driver.execute(\n    'flutter:waitFor',\n    buttonFinder\n  );\n\n  assert.strictEqual(\n    await driver.getElementText(\n      find.descendant({\n        of: find.ancestor({\n          of: find.bySemanticsLabel(RegExp('counter_semantic')),\n          matching: find.byType('Tooltip')\n        }),\n        matching: find.byType('Text')\n      })\n    ),\n    '3'\n  );\n\n  driver.deleteSession();\n})();\n\nconst validateElementPosition = async (driver, buttonFinder) => {\n  const bottomLeft = await driver.execute(\n    'flutter:getBottomLeft',\n    buttonFinder\n  );\n  assert.strictEqual(typeof bottomLeft.dx, 'number');\n  assert.strictEqual(typeof bottomLeft.dy, 'number');\n\n  const bottomRight = await driver.execute(\n    'flutter:getBottomRight',\n    buttonFinder\n  );\n  assert.strictEqual(typeof bottomRight.dx, 'number');\n  assert.strictEqual(typeof bottomRight.dy, 'number');\n\n  const center = await driver.execute('flutter:getCenter', buttonFinder);\n  assert.strictEqual(typeof center.dx, 'number');\n  assert.strictEqual(typeof center.dy, 'number');\n\n  const topLeft = await driver.execute('flutter:getTopLeft', buttonFinder);\n  assert.strictEqual(typeof topLeft.dx, 'number');\n  assert.strictEqual(typeof topLeft.dy, 'number');\n\n  const topRight = await driver.execute('flutter:getTopRight', buttonFinder);\n  assert.strictEqual(typeof topRight.dx, 'number');\n  assert.strictEqual(typeof topRight.dy, 'number');\n};\n"
  },
  {
    "path": "example/python/example.py",
    "content": "import os\n\nfrom appium.webdriver import Remote\n\n# from appium.options.common.base import AppiumOptions\n# AppiumOptions also can be used, but this may not have iOS specific commands.\nfrom appium.options.ios.xcuitest.base import XCUITestOptions\nfrom appium_flutter_finder.flutter_finder import FlutterElement, FlutterFinder\n\n# Example\n\noptions = XCUITestOptions()\noptions.automation_name = 'flutter'\noptions.platform_name = 'ios'\noptions.set_capability('platformVersion', '17.0')\noptions.set_capability('deviceName', 'iPhone 15')\noptions.set_capability('app', f'{os.path.dirname(os.path.realpath(__file__))}/../sample2/IOSFullScreen.zip')\n\ndriver = Remote('http://localhost:4723', options=options)\n\ndriver.quit()\n\n# below tests are different from the 'IOSFullScreen.zip'\nfinder = FlutterFinder()\n\ntext_finder = finder.by_text('You have pushed the button this many times:')\ntext_element = FlutterElement(driver, text_finder)\nprint(text_element.text)\n\nkey_finder = finder.by_value_key(\"next_route_key\")\ngoto_next_route_element = FlutterElement(driver, key_finder)\nprint(goto_next_route_element.text)\ngoto_next_route_element.click()\n\nback_finder = finder.page_back()\nback_element = FlutterElement(driver, back_finder)\nback_element.click()\n\ntooltip_finder = finder.by_tooltip(\"Increment\")\ndriver.execute_script('flutter:waitFor', tooltip_finder, 100)\n\nfloating_button_element = FlutterElement(driver, tooltip_finder)\nfloating_button_element.click()\n\ncounter_finder = finder.by_value_key(\"counter\")\ncounter_element = FlutterElement(driver, counter_finder)\nprint(counter_element.text)\n"
  },
  {
    "path": "example/python/requirement.txt",
    "content": "Appium-Flutter-Finder ~= 0.7.0\nAppium-Python-Client ~= 4.0.0"
  },
  {
    "path": "example/ruby/Gemfile",
    "content": "source 'https://rubygems.org'\n\ngem 'appium_flutter_finder'\ngem 'appium_lib_core'\ngem 'minitest', '~> 5.0'\n"
  },
  {
    "path": "example/ruby/example.rb",
    "content": "require 'appium_lib_core'\nrequire 'appium_flutter_finder'\n\nrequire 'minitest/autorun'\n\nclass ExampleTests < Minitest::Test\n  include ::Appium::Flutter::Finder\n\n  IOS_CAPS = {\n    caps: {\n      platformName: 'iOS',\n      automationName: 'flutter',\n      platformVersion: '15.5',\n      deviceName: 'iPhone 13',\n      app: \"#{Dir.pwd}/../app/app/Runner.zip\"\n    },\n    appium_lib: {\n      export_session: true,\n      wait_timeout: 20,\n      wait_interval: 1\n    }\n  }\n\n  def test_run_example_ios_scenario\n    @core = ::Appium::Core.for(IOS_CAPS)\n    @driver = @core.start_driver\n\n    text_finder = by_text 'You have pushed the button this many times:'\n    element = ::Appium::Flutter::Element.new(@driver, finder: text_finder)\n    assert_equal 'You have pushed the button this many times:', element.text\n\n    @driver.execute_script 'flutter:getRenderTree'\n\n    assert_equal 'ok', @driver.execute_script('flutter:checkHealth', {})\n\n    key_finder = by_value_key 'next_route_key'\n    goto_next_route_element = ::Appium::Flutter::Element.new(@driver, finder: key_finder)\n    goto_next_route_element.click\n\n    back_element = ::Appium::Flutter::Element.new(@driver, finder: page_back)\n    back_element.click\n\n    tooltip_finder = by_tooltip 'Increment'\n    @driver.execute_script('flutter:waitFor', tooltip_finder, 100)\n    floating_button_element = ::Appium::Flutter::Element.new(@driver, finder: tooltip_finder)\n    floating_button_element.click\n\n    counter_finder = by_value_key 'counter'\n    counter_element = ::Appium::Flutter::Element.new(@driver, finder: counter_finder)\n    assert_equal '1', counter_element.text\n  end\nend\n"
  },
  {
    "path": "example/ruby/example_sample2.rb",
    "content": "require 'appium_lib_core'\nrequire 'appium_flutter_finder'\n\nrequire 'minitest/autorun'\n\nclass ExampleTests < Minitest::Test\n  include ::Appium::Flutter::Finder\n\n  CAPS = {\n    caps: {\n      platformName: 'Android',\n      automationName: 'flutter',\n      udid: 'emulator-5554',\n      deviceName: 'Android',\n      app: \"#{Dir.pwd}/example/sample2/app-debug.apk\",\n      maxRetryCount: 60,\n      retryBackoffTime: 10000,\n    },\n    appium_lib: {\n      export_session: true,\n      wait_timeout: 20,\n      wait_interval: 1\n    }\n  }\n\n  def setup\n    @core = ::Appium::Core.for(CAPS)\n    @driver = @core.start_driver server_url: 'http://localhost:4723'\n  end\n\n  def teardown\n    @driver&.quit\n  end\n\n  def test_run_example_android\n    @driver.context = 'NATIVE_APP'\n\n    element = @driver.find_element :id, 'dev.flutter.example.androidfullscreen:id/launch_button'\n    element.click\n\n    @driver.orientation = :landscape\n    assert_equal @driver.orientation, :landscape\n    @driver.orientation = :portrait\n    assert_equal @driver.orientation, :portrait\n\n\n    @driver.context = 'FLUTTER'\n\n    text_finder = by_text 'Tap me!'\n\n    @driver.execute_script 'flutter:assertVisible', {text: 'Tap me!'}, 10000\n\n    element = ::Appium::Flutter::Element.new(@driver, finder: text_finder)\n    # @driver.execute_script('flutter:waitForTappable', text_finder, 10000)\n\n    assert_equal 'Tap me!', element.text\n\n    element.click\n    @driver.execute_script 'flutter:clickElement', text_finder, {timeout:10000}\n\n    text_finder = by_text 'Taps: 2'\n    element = ::Appium::Flutter::Element.new(@driver, finder: text_finder)\n    assert_equal 'Taps: 2', element.text\n\n    text_finder = by_text 'Exit this screen'\n    element = ::Appium::Flutter::Element.new(@driver, finder: text_finder)\n    element.click\n\n    @driver.context = 'NATIVE_APP'\n\n    element = @driver.wait_until { |d| d.find_element :id, 'dev.flutter.example.androidfullscreen:id/counter_label' }\n    assert_equal 'Current count: 2', element.text\n\n    @driver.context = 'FLUTTER'\n    @driver.terminate_app 'dev.flutter.example.androidfullscreen'\n    @driver.activate_app 'dev.flutter.example.androidfullscreen'\n\n    text_finder = by_text 'Tap me!'\n    element = ::Appium::Flutter::Element.new(@driver, finder: text_finder)\n    assert_equal 'Tap me!', element.text\n\n    @driver.back\n  end\nend\n"
  },
  {
    "path": "example/ruby/example_sample2_ios.rb",
    "content": "require 'appium_lib_core'\nrequire 'appium_flutter_finder'\n\nrequire 'minitest/autorun'\n\nclass ExampleTests < Minitest::Test\n  include ::Appium::Flutter::Finder\n\n  CAPS = {\n    caps: {\n      platformName: 'iOS',\n      automationName: 'flutter',\n      platformVersion: ENV[\"IOS_VERSION\"] || '18.4',\n      deviceName: ENV[\"IOS_DEVICE_NAME\"] || 'iPhone 16 Plus',\n      app: \"#{Dir.pwd}/../sample2/iOSFullScreen.zip\",\n      wdaLaunchTimeout: 600_000,\n      maxRetryCount: 60,\n      retryBackoffTime: 10000,\n\n    },\n    appium_lib: {\n      export_session: true,\n      wait_timeout: 20,\n      wait_interval: 1\n    }\n  }\n\n  def setup\n    @core = ::Appium::Core.for(CAPS)\n    @driver = @core.start_driver server_url: 'http://localhost:4723'\n  end\n\n  def teardown\n    @driver&.quit\n  end\n\n  def test_run_example_ios\n    @driver.context = 'NATIVE_APP'\n\n    @driver.orientation = :landscape\n    assert_equal @driver.orientation, :landscape\n    @driver.orientation = :portrait\n    assert_equal @driver.orientation, :portrait\n\n    element = @driver.find_element :accessibility_id, 'launchFlutter'\n    element.click\n\n    @driver.context = 'FLUTTER'\n\n    text_finder = by_text 'Tap me!'\n    element = ::Appium::Flutter::Element.new(@driver, finder: text_finder)\n    assert_equal 'Tap me!', element.text\n\n    element.click\n    element.click\n\n    text_finder = by_text 'Taps: 2'\n    element = ::Appium::Flutter::Element.new(@driver, finder: text_finder)\n    assert_equal 'Taps: 2', element.text\n\n    text_finder = by_text 'Exit this screen'\n    element = ::Appium::Flutter::Element.new(@driver, finder: text_finder)\n    element.click\n\n    @driver.context = 'NATIVE_APP'\n\n    element = @driver.wait_until { |d| d.find_element :accessibility_id, 'currentCounter' }\n    assert_equal 'Current counter: 2', element.text\n\n    @driver.context = 'FLUTTER'\n    @driver.terminate_app 'samples.flutter.example.IOSFullScreen'\n    @driver.activate_app 'samples.flutter.example.IOSFullScreen'\n\n    text_finder = by_text 'Tap me!'\n    element = ::Appium::Flutter::Element.new(@driver, finder: text_finder)\n    assert_equal 'Tap me!', element.text\n  end\nend\n"
  },
  {
    "path": "example/sample2/README.md",
    "content": "Sample app in https://github.com/flutter/samples/tree/master/add_to_app/fullscreen\n\n\n## Diff\n\nThe sample app has `enableFlutterDriverExtension` in the main.dart for testing purpose.\n\n```diff\n--- a/add_to_app/fullscreen/flutter_module/lib/main.dart\n+++ b/add_to_app/fullscreen/flutter_module/lib/main.dart\n@@ -6,8 +6,14 @@ import 'package:flutter/material.dart';\n import 'package:flutter/services.dart';\n import 'package:provider/provider.dart';\n\n+import 'package:flutter_driver/driver_extension.dart';\n+\n /// The entrypoint for the flutter module.\n void main() {\n+\n+  // for testing example\n+  enableFlutterDriverExtension();\n+\n   // This call ensures the Flutter binding has been set up before creating the\n   // MethodChannel-based model.\n```\n\n## iOS app changes\n\nAdd accessibility labels for \n`Current counter` -> `currentCounter`\n `Launch FLutter ViewController` -> `launchFlutter`"
  },
  {
    "path": "finder/dotnet/AppiumFlutterFinder/AppiumFlutterFinder.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net6.0</TargetFramework>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n    <Title>Appium Flutter Finder</Title>\n    <Authors>Ibrahim Taha</Authors>\n    <Product>Appium Flutter Finder</Product>\n    <PackageProjectUrl>https://github.com/ikharoub/appium-flutter-driver/tree/AddDotNetFlutterFinder/finder/dotnet</PackageProjectUrl>\n    <RepositoryUrl>https://github.com/ikharoub/appium-flutter-driver/tree/AddDotNetFlutterFinder/finder/dotnet</RepositoryUrl>\n    <PackageLicenseFile>License.md</PackageLicenseFile>\n    <PackageTags>automation;flutter;appium;testing</PackageTags>\n    <PackageReadmeFile>README.md</PackageReadmeFile>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Appium.WebDriver\" Version=\"4.4.5\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <None Update=\"License.md\">\n      <Pack>True</Pack>\n      <PackagePath>\\</PackagePath>\n    </None>\n    <None Update=\"README.md\">\n      <Pack>True</Pack>\n      <PackagePath>\\</PackagePath>\n    </None>\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "finder/dotnet/AppiumFlutterFinder/FlutterBy.cs",
    "content": "﻿using OpenQA.Selenium;\nusing System.Text;\nusing System.Text.RegularExpressions;\n\nnamespace AppiumFlutterFinder\n{\n    public class FlutterBy : By\n    {\n\n        internal string SerializedSearchCriteria => Convert.ToBase64String(Encoding.UTF8.GetBytes(JsonSearchCriteria));\n        internal string JsonSearchCriteria => Newtonsoft.Json.JsonConvert.SerializeObject(_searchCriteria);\n\n        dynamic _searchCriteria;\n        private FlutterBy(dynamic searchCriteria)\n        {\n            _searchCriteria = searchCriteria;\n        }\n\n        public static FlutterBy ByKeyValue(string key) => new FlutterBy(new\n        {\n            finderType = \"ByValueKey\",\n            keyValueString = key,\n            keyValueType = \"String\",\n        });\n\n        public static FlutterBy ByKeyValue(int key) => new FlutterBy(new\n        {\n            finderType = \"ByValueKey\",\n            keyValueString = key,\n            keyValueType = \"int\",\n        });\n\n        public static FlutterBy ByText(string text) => new FlutterBy(new\n        {\n            finderType = \"ByText\",\n            text\n        });\n        public static FlutterBy ByTooltip(string text) => new FlutterBy(new\n        {\n            finderType = \"ByTooltipMessage\",\n            text\n        });\n        public static FlutterBy ByType(string type) => new FlutterBy(new\n        {\n            finderType = \"ByType\",\n            type\n        });\n\n        public static FlutterBy BySemanticsLabel(string label) => new FlutterBy(new\n        {\n            finderType = \"BySemanticsLabel\",\n            isRegExp = false,\n            label\n        });\n        public static FlutterBy BySemanticsLabel(Regex pattern) => new FlutterBy(new\n        {\n            finderType = \"BySemanticsLabel\",\n            isRegExp = true,\n            label = pattern.ToString()\n        });\n\n        public static FlutterBy PageBack() => new FlutterBy(new\n        {\n            finderType = \"PageBack\"\n        });\n\n        public static FlutterBy ByAnscestor(FlutterBy of,\n                                            FlutterBy matching,\n                                            bool matchRoot = false,\n                                            bool firstMatchOnly = false)\n            => new FlutterBy(new\n            {\n                finderType = \"Ancestor\",\n                matchRoot = matchRoot.ToString().ToLower(),\n                firstMatchOnly = firstMatchOnly.ToString().ToLower(),\n                of = of.JsonSearchCriteria,\n                matching = matching.JsonSearchCriteria,\n            });\n\n        public static FlutterBy ByDescendant(FlutterBy of,\n                                             FlutterBy matching,\n                                             bool matchRoot = false,\n                                             bool firstMatchOnly = false)\n            => new FlutterBy(new\n            {\n                finderType = \"Descendant\",\n                matchRoot = matchRoot.ToString().ToLower(),\n                firstMatchOnly = firstMatchOnly.ToString().ToLower(),\n                of = of.JsonSearchCriteria,\n                matching = matching.JsonSearchCriteria,\n            });\n\n\n    }\n}\n"
  },
  {
    "path": "finder/dotnet/AppiumFlutterFinder/FlutterDriver.cs",
    "content": "﻿using AppiumFlutterFinder;\nusing OpenQA.Selenium;\nusing OpenQA.Selenium.Appium;\nusing OpenQA.Selenium.Appium.Android;\nusing OpenQA.Selenium.Appium.MultiTouch;\nusing OpenQA.Selenium.Appium.Service;\nusing OpenQA.Selenium.Remote;\nusing OpenQA.Selenium.Support.UI;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace AppiumFlutterFinder\n{\n    public class FlutterDriver : AppiumDriver<FlutterElement>\n    {\n        #region Overrides\n        public FlutterDriver(ICapabilities appiumOptions) : base(appiumOptions)\n        {\n        }\n\n        public FlutterDriver(ICommandExecutor commandExecutor, ICapabilities appiumOptions) : base(commandExecutor, appiumOptions)\n        {\n        }\n\n        public FlutterDriver(ICapabilities appiumOptions, TimeSpan commandTimeout) : base(appiumOptions, commandTimeout)\n        {\n        }\n\n\n\n        public FlutterDriver(AppiumServiceBuilder builder, ICapabilities appiumOptions) : base(builder, appiumOptions)\n        {\n        }\n\n        public FlutterDriver(Uri remoteAddress, ICapabilities appiumOptions) : base(remoteAddress, appiumOptions)\n        {\n        }\n\n        public FlutterDriver(AppiumLocalService service, ICapabilities appiumOptions) : base(service, appiumOptions)\n        {\n        }\n\n\n        public FlutterDriver(AppiumServiceBuilder builder, ICapabilities appiumOptions, TimeSpan commandTimeout) : base(builder, appiumOptions, commandTimeout)\n        {\n        }\n\n        public FlutterDriver(Uri remoteAddress, ICapabilities appiumOptions, TimeSpan commandTimeout) : base(remoteAddress, appiumOptions, commandTimeout)\n        {\n        }\n\n        protected override RemoteWebElementFactory CreateElementFactory() => new FlutterElementFactory(this);\n        public FlutterDriver(AppiumLocalService service, ICapabilities appiumOptions, TimeSpan commandTimeout) : base(service, appiumOptions, commandTimeout)\n        {\n\n        }\n        #endregion\n\n\n        public void WaitForFirstFrame()\n        {\n            ExecuteScript(\"flutter:waitForFirstFrame\");\n        }\n\n        public void SwitchToAndroidDriver()\n            => Context = \"NATIVE_APP\";\n\n        public void SwitchToFlutterDriver()\n            => Context = \"FLUTTER\";\n\n        public FlutterElement WaitForElementToBeVisible(FlutterBy by, int wait = 60)\n        {\n            var id = (string)ExecuteScript(\"flutter:waitFor\", by.SerializedSearchCriteria, wait * 1000);\n            return new FlutterElement(this, id);\n        }\n\n\n        public FlutterElement WaitForElementToBeClickable(FlutterBy by, int wait = 60)\n        {\n            var id = (string)ExecuteScript(\"flutter:waitForTappable\", by.SerializedSearchCriteria, wait * 1000);\n            return new FlutterElement(this, id);\n        }\n\n        public void SetFrameSync(bool isSet, int wait = 60)\n        {\n            ExecuteScript(\"flutter:setFrameSync\", isSet, wait * 1000);\n        }\n        public void WaitForAbscense(FlutterBy by, int wait = 60)\n            => ExecuteScript(\"flutter:waitForAbsent\", by.SerializedSearchCriteria, wait * 1000);\n\n        public void SaveScreenshot(string name)\n        {\n            var screenshot = GetScreenshot();\n            screenshot.SaveAsFile(name);\n        }\n\n        public void RunUnsynchronized(Action action)\n        {\n            SetFrameSync(false);\n            action.Invoke();\n            SetFrameSync(true);\n        }\n        public void Click(FlutterBy by)\n            => new FlutterElement(this, by.SerializedSearchCriteria).Click();\n\n        public void Tap(double x, double y, long? count = null)\n        {\n            SwitchToAndroidDriver();\n            new TouchAction(this).Tap(x, y, count).Perform();\n            SwitchToFlutterDriver();\n        }\n\n\n\n        public void PageBack()\n            => new FlutterElement(this, FlutterBy.PageBack().SerializedSearchCriteria).Click();\n\n    }\n}\n"
  },
  {
    "path": "finder/dotnet/AppiumFlutterFinder/FlutterElement.cs",
    "content": "﻿using OpenQA.Selenium.Appium;\nusing OpenQA.Selenium.Remote;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace AppiumFlutterFinder\n{\n    public class FlutterElement : AppiumWebElement\n    {\n        public FlutterElement(RemoteWebDriver parent, FlutterBy by) : base(parent, by.SerializedSearchCriteria)\n        {\n\n        }\n        public FlutterElement(RemoteWebDriver parent, string id) : base(parent, id)\n        {\n        }\n\n        public void FocusAndSendKeys(string text)\n        {\n            Click();\n            SendKeys(text);\n        }\n    }\n}\n"
  },
  {
    "path": "finder/dotnet/AppiumFlutterFinder/FlutterElementFactory.cs",
    "content": "﻿using OpenQA.Selenium.Appium.Android;\nusing OpenQA.Selenium.Appium;\nusing OpenQA.Selenium.Remote;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace AppiumFlutterFinder\n{\n    public class FlutterElementFactory : CachedElementFactory<FlutterElement>\n    {\n        public FlutterElementFactory(RemoteWebDriver parentDriver): base(parentDriver)\n        {\n        }\n\n        protected override FlutterElement CreateCachedElement(RemoteWebDriver parentDriver, string elementId)\n        {\n            return new FlutterElement(parentDriver, id: elementId);\n        }\n    }\n}\n"
  },
  {
    "path": "finder/dotnet/AppiumFlutterFinder/License.md",
    "content": "﻿MIT License\n\nCopyright (c) [year] [fullname]\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": "finder/dotnet/AppiumFlutterFinder/Readme.md",
    "content": "﻿.NET FLUTTER FINDER."
  },
  {
    "path": "finder/dotnet/AppiumFlutterFinderTests/AppiumFlutterFinderTests.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net6.0</TargetFramework>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n\n    <IsPackable>false</IsPackable>\n    <IsTestProject>true</IsTestProject>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.NET.Test.Sdk\" Version=\"17.5.0\" />\n    <PackageReference Include=\"NUnit\" Version=\"3.13.3\" />\n    <PackageReference Include=\"NUnit3TestAdapter\" Version=\"4.4.2\" />\n    <PackageReference Include=\"NUnit.Analyzers\" Version=\"3.6.1\" />\n    <PackageReference Include=\"coverlet.collector\" Version=\"3.2.0\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\AppiumFlutterFinder\\AppiumFlutterFinder.csproj\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "finder/dotnet/AppiumFlutterFinderTests/FlutterFinderTests.cs",
    "content": "using AppiumFlutterFinder;\nusing System.Text.RegularExpressions;\n\nnamespace AppiumFlutterFinderTests\n{\n    public class Tests\n    {\n\n        [Test]\n        public void TestByAncestor()\n        {\n            var element = new FlutterElement(null, FlutterBy.ByAnscestor(\n                FlutterBy.ByAnscestor(FlutterBy.PageBack(),\n                                      FlutterBy.PageBack()),\n                FlutterBy.ByAnscestor(FlutterBy.PageBack(),\n                                      FlutterBy.PageBack()),\n                firstMatchOnly: true\n                ));\n            Assert.AreEqual(\"eyJmaW5kZXJUeXBlIjoiQW5jZXN0b3IiLCJtYXRjaFJvb3QiOiJmYWxzZSIsImZpcnN0TWF0Y2hPbmx5IjoidHJ1ZSIsIm9mIjoie1wiZmluZGVyVHlwZVwiOlwiQW5jZXN0b3JcIixcIm1hdGNoUm9vdFwiOlwiZmFsc2VcIixcImZpcnN0TWF0Y2hPbmx5XCI6XCJmYWxzZVwiLFwib2ZcIjpcIntcXFwiZmluZGVyVHlwZVxcXCI6XFxcIlBhZ2VCYWNrXFxcIn1cIixcIm1hdGNoaW5nXCI6XCJ7XFxcImZpbmRlclR5cGVcXFwiOlxcXCJQYWdlQmFja1xcXCJ9XCJ9IiwibWF0Y2hpbmciOiJ7XCJmaW5kZXJUeXBlXCI6XCJBbmNlc3RvclwiLFwibWF0Y2hSb290XCI6XCJmYWxzZVwiLFwiZmlyc3RNYXRjaE9ubHlcIjpcImZhbHNlXCIsXCJvZlwiOlwie1xcXCJmaW5kZXJUeXBlXFxcIjpcXFwiUGFnZUJhY2tcXFwifVwiLFwibWF0Y2hpbmdcIjpcIntcXFwiZmluZGVyVHlwZVxcXCI6XFxcIlBhZ2VCYWNrXFxcIn1cIn0ifQ==\", element.Id);\n        }\n\n        [Test]\n        public void TestBydescendant()\n        {\n            var element = new FlutterElement(null, FlutterBy.ByDescendant(\n                FlutterBy.ByDescendant(FlutterBy.PageBack(),\n                                      FlutterBy.PageBack()),\n                FlutterBy.ByDescendant(FlutterBy.PageBack(),\n                                      FlutterBy.PageBack())\n                ));\n            Assert.AreEqual(\"eyJmaW5kZXJUeXBlIjoiRGVzY2VuZGFudCIsIm1hdGNoUm9vdCI6ImZhbHNlIiwiZmlyc3RNYXRjaE9ubHkiOiJmYWxzZSIsIm9mIjoie1wiZmluZGVyVHlwZVwiOlwiRGVzY2VuZGFudFwiLFwibWF0Y2hSb290XCI6XCJmYWxzZVwiLFwiZmlyc3RNYXRjaE9ubHlcIjpcImZhbHNlXCIsXCJvZlwiOlwie1xcXCJmaW5kZXJUeXBlXFxcIjpcXFwiUGFnZUJhY2tcXFwifVwiLFwibWF0Y2hpbmdcIjpcIntcXFwiZmluZGVyVHlwZVxcXCI6XFxcIlBhZ2VCYWNrXFxcIn1cIn0iLCJtYXRjaGluZyI6IntcImZpbmRlclR5cGVcIjpcIkRlc2NlbmRhbnRcIixcIm1hdGNoUm9vdFwiOlwiZmFsc2VcIixcImZpcnN0TWF0Y2hPbmx5XCI6XCJmYWxzZVwiLFwib2ZcIjpcIntcXFwiZmluZGVyVHlwZVxcXCI6XFxcIlBhZ2VCYWNrXFxcIn1cIixcIm1hdGNoaW5nXCI6XCJ7XFxcImZpbmRlclR5cGVcXFwiOlxcXCJQYWdlQmFja1xcXCJ9XCJ9In0=\", element.Id);\n        }\n\n        [Test]\n        public void test_by_semantics_label()\n        {\n            var element = new FlutterElement(null, FlutterBy.BySemanticsLabel(\"simple\"));\n            Assert.AreEqual(\"eyJmaW5kZXJUeXBlIjoiQnlTZW1hbnRpY3NMYWJlbCIsImlzUmVnRXhwIjpmYWxzZSwibGFiZWwiOiJzaW1wbGUifQ==\", element.Id);\n        }\n\n        [Test]\n        public void TestBySemanticsLabelRegex()\n        {\n            var element = new FlutterElement(null, FlutterBy.BySemanticsLabel(new Regex(\"complicated\")));\n            Assert.AreEqual(\"eyJmaW5kZXJUeXBlIjoiQnlTZW1hbnRpY3NMYWJlbCIsImlzUmVnRXhwIjp0cnVlLCJsYWJlbCI6ImNvbXBsaWNhdGVkIn0=\", element.Id);\n        }\n        [Test]\n        public void TestByTooltip()\n        {\n            var element = new FlutterElement(null, FlutterBy.ByTooltip(\"myText\"));\n            Assert.AreEqual(\"eyJmaW5kZXJUeXBlIjoiQnlUb29sdGlwTWVzc2FnZSIsInRleHQiOiJteVRleHQifQ==\", element.Id);\n        }\n\n        [Test]\n        public void TestByType()\n        {\n            var element = new FlutterElement(null, FlutterBy.ByType(\"myText\"));\n            Assert.AreEqual(\"eyJmaW5kZXJUeXBlIjoiQnlUeXBlIiwidHlwZSI6Im15VGV4dCJ9\", element.Id);\n        }\n\n        [Test]\n        public void TestByValueKeyInt()\n        {\n            var element = new FlutterElement(null, FlutterBy.ByKeyValue(42));\n            Assert.AreEqual(\"eyJmaW5kZXJUeXBlIjoiQnlWYWx1ZUtleSIsImtleVZhbHVlU3RyaW5nIjo0Miwia2V5VmFsdWVUeXBlIjoiaW50In0=\", element.Id);\n        }\n\n        [Test]\n        public void TestByValueKeyString()\n        {\n            var element = new FlutterElement(null, FlutterBy.ByKeyValue(\"42\"));\n            Assert.AreEqual(\"eyJmaW5kZXJUeXBlIjoiQnlWYWx1ZUtleSIsImtleVZhbHVlU3RyaW5nIjoiNDIiLCJrZXlWYWx1ZVR5cGUiOiJTdHJpbmcifQ==\", element.Id);\n        }\n\n        [Test]\n        public void TestPageBack()\n        {\n            var element = new FlutterElement(null, FlutterBy.PageBack());\n            Assert.AreEqual(\"eyJmaW5kZXJUeXBlIjoiUGFnZUJhY2sifQ==\", element.Id);\n        }\n\n        [Test]\n        public void TestByText()\n        {\n            var element = new FlutterElement(null, FlutterBy.ByText(\"This is 2nd route\"));\n            Assert.AreEqual(\"eyJmaW5kZXJUeXBlIjoiQnlUZXh0IiwidGV4dCI6IlRoaXMgaXMgMm5kIHJvdXRlIn0=\", element.Id);\n        }\n\n    }\n}"
  },
  {
    "path": "finder/dotnet/AppiumFlutterFinderTests/Usings.cs",
    "content": "global using NUnit.Framework;"
  },
  {
    "path": "finder/dotnet/DotNetAppiumFlutterFinder.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 17\nVisualStudioVersion = 17.6.33815.320\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"AppiumFlutterFinder\", \"AppiumFlutterFinder\\AppiumFlutterFinder.csproj\", \"{1E8B7B00-E283-4348-B76B-14E9AE262287}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"AppiumFlutterFinderTests\", \"AppiumFlutterFinderTests\\AppiumFlutterFinderTests.csproj\", \"{C19777E3-48D1-455C-90CB-8665983CE719}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{1E8B7B00-E283-4348-B76B-14E9AE262287}.Debug|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{1E8B7B00-E283-4348-B76B-14E9AE262287}.Debug|Any CPU.Build.0 = Release|Any CPU\n\t\t{1E8B7B00-E283-4348-B76B-14E9AE262287}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{1E8B7B00-E283-4348-B76B-14E9AE262287}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{C19777E3-48D1-455C-90CB-8665983CE719}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{C19777E3-48D1-455C-90CB-8665983CE719}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{C19777E3-48D1-455C-90CB-8665983CE719}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{C19777E3-48D1-455C-90CB-8665983CE719}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {0EB4511B-CB82-4980-B254-C5C88491BE79}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "finder/kotlin/.gitignore",
    "content": ".gradle/*\nbuild/*\n"
  },
  {
    "path": "finder/kotlin/README.md",
    "content": "# AppiumFlutterFinder\n\nKotlin finder elements for https://github.com/appium/appium-flutter-driver\n\n## Installation\n\nThis is available via Jitpack, or the local dependencies.\n\nhttps://jitpack.io/#appium/appium-flutter-driver\n\nAn example of snapshot of the `main`.\n\n- `settings.gradle`\n```groovy\n\tdependencyResolutionManagement {\n\t\trepositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)\n\t\trepositories {\n\t\t\tmavenCentral()\n\t\t\tmaven { url 'https://jitpack.io' }\n\t\t}\n\t}\n```\n\n- gradle file\n```groovy\n\tdependencies {\n\t    testImplementation 'com.github.appium:appium-flutter-driver:main-SNAPSHOT'\n\t}\n```\n\n```groovy\n\tdependencies {\n\t    testImplementation 'com.github.appium:appium-flutter-driver:kotlin-finder-0.0.7'\n\t}\n```\n\n\nPlease check https://docs.jitpack.io/ for more details about the jitpack usage.\n\n## Package name\n\n`pro.truongsinh.appium_flutter` is this project's package name space.\n\n## Changlogs\n\n- 0.0.7\n    - Available via jitpack\n\n# Other Java implementations\n\n- https://github.com/ashwithpoojary98/javaflutterfinder\n- https://github.com/5v1988/appium-flutter-client\n"
  },
  {
    "path": "finder/kotlin/build.gradle.kts",
    "content": "import org.gradle.jvm.tasks.Jar\n\ngroup = \"pro.truongsinh\"\nversion = \"0.0.6\"\n\nplugins {\n    id(\"kotlinx-serialization\") version \"1.3.40\"\n    `maven-publish`\n    kotlin(\"jvm\") version \"1.3.40\" \n}\n\nrepositories {\n    mavenCentral()\n}\n\ndependencies {\n    implementation(kotlin(\"stdlib\")) \n    implementation (\"org.jetbrains.kotlinx:kotlinx-serialization-runtime:0.14.0\")\n    implementation (\"io.appium:java-client:8.0.0\")\n    implementation(\"org.seleniumhq.selenium:selenium-support:4.1.1\")\n    testImplementation(\"junit:junit:4.12\")\n}\n\npublishing {\n    publications {\n        create<MavenPublication>(\"default\") { \n            from(components[\"java\"])\n        }\n    }\n    repositories {\n        maven {\n            url = uri(\"$buildDir/repository\") \n        }\n    }\n}\n"
  },
  {
    "path": "finder/kotlin/gradle/wrapper/gradle-wrapper.properties",
    "content": "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-7.5-all.zip\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\n"
  },
  {
    "path": "finder/kotlin/gradle.properties",
    "content": "# Project-wide Gradle settings.\n\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will override*\n# any settings specified in this file.\n\n# For more details on how to configure your build environment visit\n# http://www.gradle.org/docs/current/userguide/build_environment.html\n\n# Specifies the JVM arguments used for the daemon process.\n# The setting is particularly useful for tweaking memory settings.\norg.gradle.jvmargs=-Xmx1536m\n\n# When configured, Gradle will run in incubating parallel mode.\n# This option should only be used with decoupled projects. More details, visit\n# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects\n# org.gradle.parallel=true\n\norg.gradle.configureondemand=false\n\nandroid.useAndroidX=true\n\norg.gradle.vfs.watch=true\norg.gradle.caching=true\n# https://youtrack.jetbrains.com/issue/KT-46708\nkotlin.stdlib.default.dependency=false\nkotlin.experimental=true\n"
  },
  {
    "path": "finder/kotlin/gradlew",
    "content": "#!/usr/bin/env sh\n\n#\n# Copyright 2015 the original author or authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      https://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n\n##############################################################################\n##\n##  Gradle start up script for UN*X\n##\n##############################################################################\n\n# Attempt to set APP_HOME\n# Resolve links: $0 may be a link\nPRG=\"$0\"\n# Need this for relative symlinks.\nwhile [ -h \"$PRG\" ] ; do\n    ls=`ls -ld \"$PRG\"`\n    link=`expr \"$ls\" : '.*-> \\(.*\\)$'`\n    if expr \"$link\" : '/.*' > /dev/null; then\n        PRG=\"$link\"\n    else\n        PRG=`dirname \"$PRG\"`\"/$link\"\n    fi\ndone\nSAVED=\"`pwd`\"\ncd \"`dirname \\\"$PRG\\\"`/\" >/dev/null\nAPP_HOME=\"`pwd -P`\"\ncd \"$SAVED\" >/dev/null\n\nAPP_NAME=\"Gradle\"\nAPP_BASE_NAME=`basename \"$0\"`\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS='\"-Xmx64m\" \"-Xms64m\"'\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=\"maximum\"\n\nwarn () {\n    echo \"$*\"\n}\n\ndie () {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n}\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\nnonstop=false\ncase \"`uname`\" in\n  CYGWIN* )\n    cygwin=true\n    ;;\n  Darwin* )\n    darwin=true\n    ;;\n  MINGW* )\n    msys=true\n    ;;\n  NONSTOP* )\n    nonstop=true\n    ;;\nesac\n\nCLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar\n\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=\"$JAVA_HOME/jre/sh/java\"\n    else\n        JAVACMD=\"$JAVA_HOME/bin/java\"\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=\"java\"\n    which java >/dev/null 2>&1 || die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\nfi\n\n# Increase the maximum file descriptors if we can.\nif [ \"$cygwin\" = \"false\" -a \"$darwin\" = \"false\" -a \"$nonstop\" = \"false\" ] ; then\n    MAX_FD_LIMIT=`ulimit -H -n`\n    if [ $? -eq 0 ] ; then\n        if [ \"$MAX_FD\" = \"maximum\" -o \"$MAX_FD\" = \"max\" ] ; then\n            MAX_FD=\"$MAX_FD_LIMIT\"\n        fi\n        ulimit -n $MAX_FD\n        if [ $? -ne 0 ] ; then\n            warn \"Could not set maximum file descriptor limit: $MAX_FD\"\n        fi\n    else\n        warn \"Could not query maximum file descriptor limit: $MAX_FD_LIMIT\"\n    fi\nfi\n\n# For Darwin, add options to specify how the application appears in the dock\nif $darwin; then\n    GRADLE_OPTS=\"$GRADLE_OPTS \\\"-Xdock:name=$APP_NAME\\\" \\\"-Xdock:icon=$APP_HOME/media/gradle.icns\\\"\"\nfi\n\n# For Cygwin or MSYS, switch paths to Windows format before running java\nif [ \"$cygwin\" = \"true\" -o \"$msys\" = \"true\" ] ; then\n    APP_HOME=`cygpath --path --mixed \"$APP_HOME\"`\n    CLASSPATH=`cygpath --path --mixed \"$CLASSPATH\"`\n\n    JAVACMD=`cygpath --unix \"$JAVACMD\"`\n\n    # We build the pattern for arguments to be converted via cygpath\n    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`\n    SEP=\"\"\n    for dir in $ROOTDIRSRAW ; do\n        ROOTDIRS=\"$ROOTDIRS$SEP$dir\"\n        SEP=\"|\"\n    done\n    OURCYGPATTERN=\"(^($ROOTDIRS))\"\n    # Add a user-defined pattern to the cygpath arguments\n    if [ \"$GRADLE_CYGPATTERN\" != \"\" ] ; then\n        OURCYGPATTERN=\"$OURCYGPATTERN|($GRADLE_CYGPATTERN)\"\n    fi\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    i=0\n    for arg in \"$@\" ; do\n        CHECK=`echo \"$arg\"|egrep -c \"$OURCYGPATTERN\" -`\n        CHECK2=`echo \"$arg\"|egrep -c \"^-\"`                                 ### Determine if an option\n\n        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition\n            eval `echo args$i`=`cygpath --path --ignore --mixed \"$arg\"`\n        else\n            eval `echo args$i`=\"\\\"$arg\\\"\"\n        fi\n        i=`expr $i + 1`\n    done\n    case $i in\n        0) set -- ;;\n        1) set -- \"$args0\" ;;\n        2) set -- \"$args0\" \"$args1\" ;;\n        3) set -- \"$args0\" \"$args1\" \"$args2\" ;;\n        4) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" ;;\n        5) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" ;;\n        6) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" ;;\n        7) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" ;;\n        8) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" ;;\n        9) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" \"$args8\" ;;\n    esac\nfi\n\n# Escape application args\nsave () {\n    for i do printf %s\\\\n \"$i\" | sed \"s/'/'\\\\\\\\''/g;1s/^/'/;\\$s/\\$/' \\\\\\\\/\" ; done\n    echo \" \"\n}\nAPP_ARGS=`save \"$@\"`\n\n# Collect all arguments for the java command, following the shell quoting and substitution rules\neval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS \"\\\"-Dorg.gradle.appname=$APP_BASE_NAME\\\"\" -classpath \"\\\"$CLASSPATH\\\"\" org.gradle.wrapper.GradleWrapperMain \"$APP_ARGS\"\n\nexec \"$JAVACMD\" \"$@\"\n"
  },
  {
    "path": "finder/kotlin/gradlew.bat",
    "content": "@rem\r\n@rem Copyright 2015 the original author or authors.\r\n@rem\r\n@rem Licensed under the Apache License, Version 2.0 (the \"License\");\r\n@rem you may not use this file except in compliance with the License.\r\n@rem You may obtain a copy of the License at\r\n@rem\r\n@rem      https://www.apache.org/licenses/LICENSE-2.0\r\n@rem\r\n@rem Unless required by applicable law or agreed to in writing, software\r\n@rem distributed under the License is distributed on an \"AS IS\" BASIS,\r\n@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n@rem See the License for the specific language governing permissions and\r\n@rem limitations under the License.\r\n@rem\r\n\r\n@if \"%DEBUG%\" == \"\" @echo off\r\n@rem ##########################################################################\r\n@rem\r\n@rem  Gradle startup script for Windows\r\n@rem\r\n@rem ##########################################################################\r\n\r\n@rem Set local scope for the variables with windows NT shell\r\nif \"%OS%\"==\"Windows_NT\" setlocal\r\n\r\nset DIRNAME=%~dp0\r\nif \"%DIRNAME%\" == \"\" set DIRNAME=.\r\nset APP_BASE_NAME=%~n0\r\nset APP_HOME=%DIRNAME%\r\n\r\n@rem Resolve any \".\" and \"..\" in APP_HOME to make it shorter.\r\nfor %%i in (\"%APP_HOME%\") do set APP_HOME=%%~fi\r\n\r\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\r\nset DEFAULT_JVM_OPTS=\"-Xmx64m\" \"-Xms64m\"\r\n\r\n@rem Find java.exe\r\nif defined JAVA_HOME goto findJavaFromJavaHome\r\n\r\nset JAVA_EXE=java.exe\r\n%JAVA_EXE% -version >NUL 2>&1\r\nif \"%ERRORLEVEL%\" == \"0\" goto execute\r\n\r\necho.\r\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\r\necho.\r\necho Please set the JAVA_HOME variable in your environment to match the\r\necho location of your Java installation.\r\n\r\ngoto fail\r\n\r\n:findJavaFromJavaHome\r\nset JAVA_HOME=%JAVA_HOME:\"=%\r\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\r\n\r\nif exist \"%JAVA_EXE%\" goto execute\r\n\r\necho.\r\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%\r\necho.\r\necho Please set the JAVA_HOME variable in your environment to match the\r\necho location of your Java installation.\r\n\r\ngoto fail\r\n\r\n:execute\r\n@rem Setup the command line\r\n\r\nset CLASSPATH=%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\r\n\r\n\r\n@rem Execute Gradle\r\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -classpath \"%CLASSPATH%\" org.gradle.wrapper.GradleWrapperMain %*\r\n\r\n:end\r\n@rem End local scope for the variables with windows NT shell\r\nif \"%ERRORLEVEL%\"==\"0\" goto mainEnd\r\n\r\n:fail\r\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\r\nrem the _cmd.exe /c_ return code!\r\nif  not \"\" == \"%GRADLE_EXIT_CONSOLE%\" exit 1\r\nexit /b 1\r\n\r\n:mainEnd\r\nif \"%OS%\"==\"Windows_NT\" endlocal\r\n\r\n:omega\r\n"
  },
  {
    "path": "finder/kotlin/settings.gradle.kts",
    "content": "rootProject.name = \"appium-flutter-finder\"\n\npluginManagement {\n    resolutionStrategy {\n        eachPlugin {\n            if (requested.id.id == \"kotlinx-serialization\") {\n                useModule(\"org.jetbrains.kotlin:kotlin-serialization:${requested.version}\")\n            }\n        }\n    }\n\n    repositories {\n        gradlePluginPortal()\n        maven(\"https://kotlin.bintray.com/kotlinx\")\n    }\n}\n"
  },
  {
    "path": "finder/kotlin/src/main/kotlin/pro/truongsinh/appium_flutter/FlutterFinder.kt",
    "content": "package pro.truongsinh.appium_flutter\n\nimport java.util.regex.Pattern\n\nimport org.openqa.selenium.remote.RemoteWebDriver\nimport org.openqa.selenium.remote.FileDetector\nimport pro.truongsinh.appium_flutter.finder.FlutterElement\nimport pro.truongsinh.appium_flutter.finder.ancestor as _ancestor\nimport pro.truongsinh.appium_flutter.finder.bySemanticsLabel as _bySemanticsLabel\nimport pro.truongsinh.appium_flutter.finder.byTooltip as _byTooltip\nimport pro.truongsinh.appium_flutter.finder.byType as _byType\nimport pro.truongsinh.appium_flutter.finder.byValueKey as _byValueKey\nimport pro.truongsinh.appium_flutter.finder.descendant as _descendant\nimport pro.truongsinh.appium_flutter.finder.pageBack as _pageBack\nimport pro.truongsinh.appium_flutter.finder.text as _text\n\n\npublic class FlutterFinder(private val driver: RemoteWebDriver) {\n  private val fileDetector = FileDetector { _ -> null }\n  fun ancestor(of: FlutterElement, matching: FlutterElement): FlutterElement {\n    val f = _ancestor(of, matching, matchRoot = false, firstMatchOnly = false)\n    f.setParent(driver)\n    f.setFileDetector(fileDetector)\n    return f\n  }\n  fun ancestor(of: FlutterElement, matching: FlutterElement, matchRoot: Boolean = false, firstMatchOnly: Boolean = false): FlutterElement {\n    val f = _ancestor(of, matching, matchRoot, firstMatchOnly)\n    f.setParent(driver)\n    f.setFileDetector(fileDetector)\n    return f\n  }\n  fun bySemanticsLabel(label: String): FlutterElement {\n    val f = _bySemanticsLabel(label)\n    f.setParent(driver)\n    f.setFileDetector(fileDetector)\n    return f\n  }\n  fun bySemanticsLabel(label: Pattern): FlutterElement {\n    val f = _bySemanticsLabel(label)\n    f.setParent(driver)\n    f.setFileDetector(fileDetector)\n    return f\n  }\n  fun byTooltip(input: String): FlutterElement {\n    val f = _byTooltip(input)\n    f.setParent(driver)\n    f.setFileDetector(fileDetector)\n    return f\n  }\n  fun byType(input: String): FlutterElement {\n    val f = _byType(input)\n    f.setParent(driver)\n    f.setFileDetector(fileDetector)\n    return f\n  }\n  fun byValueKey(input: String): FlutterElement {\n    val f = _byValueKey(input)\n    f.setParent(driver)\n    f.setFileDetector(fileDetector)\n    return f\n  }\n  fun byValueKey(input: Int): FlutterElement {\n    val f = _byValueKey(input)\n    f.setParent(driver)\n    f.setFileDetector(fileDetector)\n    return f\n  }\n  fun descendant(of: FlutterElement, matching: FlutterElement): FlutterElement {\n    return _descendant(of, matching, matchRoot = false, firstMatchOnly = false)\n  }\n  fun descendant(of: FlutterElement, matching: FlutterElement, matchRoot: Boolean = false, firstMatchOnly: Boolean = false): FlutterElement {\n    val f = _descendant(of, matching, matchRoot, firstMatchOnly)\n    f.setParent(driver)\n    f.setFileDetector(fileDetector)\n    return f\n  }\n  fun pageBack(): FlutterElement {\n    val f = _pageBack()\n    f.setParent(driver)\n    f.setFileDetector(fileDetector)\n    return f\n  }\n  fun text(input: String): FlutterElement {\n    val f = _text(input)\n    f.setParent(driver)\n    f.setFileDetector(fileDetector)\n    return f\n  }\n}\n"
  },
  {
    "path": "finder/kotlin/src/main/kotlin/pro/truongsinh/appium_flutter/finder/FlutterElement.kt",
    "content": "package pro.truongsinh.appium_flutter.finder\n\nimport org.openqa.selenium.remote.RemoteWebElement\n\npublic class FlutterElement(m: Map<String, *>) : RemoteWebElement() {\n  private var _rawMap: Map<String, *> = m\n\n  init {\n    id = serialize(m)\n  }\n  fun getRawMap():  Map<String, *> { return _rawMap }\n\n  override fun toString(): String {\n    return String.format(\"[FlutterElement]\")\n  }\n}"
  },
  {
    "path": "finder/kotlin/src/main/kotlin/pro/truongsinh/appium_flutter/finder/ancestor.kt",
    "content": "@file:JvmName(\"_FinderRawMethods\")\n@file:JvmMultifileClass\npackage pro.truongsinh.appium_flutter.finder\n\nfun ancestor(of: FlutterElement, matching: FlutterElement, matchRoot: Boolean = false, firstMatchOnly: Boolean = false): FlutterElement {\n  val m = mutableMapOf<String, Any>(\n    \"finderType\" to \"Ancestor\",\n    \"matchRoot\" to matchRoot.toString(),\n    \"firstMatchOnly\" to firstMatchOnly.toString()\n  )\n  m[\"of\"] = of.getRawMap()\n  m[\"matching\"] = matching.getRawMap()\n  return FlutterElement(m)\n}\n"
  },
  {
    "path": "finder/kotlin/src/main/kotlin/pro/truongsinh/appium_flutter/finder/bySemanticsLabel.kt",
    "content": "@file:JvmName(\"_FinderRawMethods\")\n@file:JvmMultifileClass\npackage pro.truongsinh.appium_flutter.finder\n\nimport java.util.regex.Pattern;\n\nfun bySemanticsLabel(label: String): FlutterElement {\n  return FlutterElement(mapOf(\n    \"finderType\" to \"BySemanticsLabel\",\n    \"isRegExp\" to false,\n    \"label\" to label\n    ))\n}\n\nfun bySemanticsLabel(label: Pattern): FlutterElement {\n  return FlutterElement(mapOf(\n    \"finderType\" to \"BySemanticsLabel\",\n    \"isRegExp\" to true,\n    \"label\" to label.toString()\n    ))\n}\n"
  },
  {
    "path": "finder/kotlin/src/main/kotlin/pro/truongsinh/appium_flutter/finder/byTooltip.kt",
    "content": "@file:JvmName(\"_FinderRawMethods\")\n@file:JvmMultifileClass\npackage pro.truongsinh.appium_flutter.finder\n\nfun byTooltip(input: String): FlutterElement {\n  return FlutterElement(mapOf(\n    \"finderType\" to \"ByTooltipMessage\",\n    \"text\" to input\n    ))\n}\n"
  },
  {
    "path": "finder/kotlin/src/main/kotlin/pro/truongsinh/appium_flutter/finder/byType.kt",
    "content": "@file:JvmName(\"_FinderRawMethods\")\n@file:JvmMultifileClass\npackage pro.truongsinh.appium_flutter.finder\n\nfun byType(input: String): FlutterElement {\n  return FlutterElement(mapOf(\n    \"finderType\" to \"ByType\",\n    \"type\" to input\n    ))\n}\n"
  },
  {
    "path": "finder/kotlin/src/main/kotlin/pro/truongsinh/appium_flutter/finder/byValueKey.kt",
    "content": "@file:JvmName(\"_FinderRawMethods\")\n@file:JvmMultifileClass\npackage pro.truongsinh.appium_flutter.finder\n\nfun byValueKey(input: String): FlutterElement {\n  return FlutterElement(mapOf(\n    \"finderType\" to \"ByValueKey\",\n    \"keyValueType\" to \"String\",\n    \"keyValueString\" to input\n    ))\n}\n\nfun byValueKey(input: Int): FlutterElement {\n  return FlutterElement(mapOf(\n    \"finderType\" to \"ByValueKey\",\n    \"keyValueType\" to \"int\",\n    \"keyValueString\" to input\n    ))\n}\n"
  },
  {
    "path": "finder/kotlin/src/main/kotlin/pro/truongsinh/appium_flutter/finder/descendant.kt",
    "content": "@file:JvmName(\"_FinderRawMethods\")\n@file:JvmMultifileClass\npackage pro.truongsinh.appium_flutter.finder\n\nfun descendant(of: FlutterElement, matching: FlutterElement, matchRoot: Boolean = false, firstMatchOnly: Boolean = false): FlutterElement {\n  val m = mutableMapOf<String, Any>(\n    \"finderType\" to \"Descendant\",\n    \"matchRoot\" to matchRoot.toString(),\n    \"firstMatchOnly\" to firstMatchOnly.toString()\n  )\n  m[\"of\"] = of.getRawMap()\n  m[\"matching\"] = matching.getRawMap()\n  return FlutterElement(m)\n}\n"
  },
  {
    "path": "finder/kotlin/src/main/kotlin/pro/truongsinh/appium_flutter/finder/pageback.kt",
    "content": "@file:JvmName(\"_FinderRawMethods\")\n@file:JvmMultifileClass\npackage pro.truongsinh.appium_flutter.finder\n\nfun pageBack(): FlutterElement {\n  return FlutterElement(mapOf(\"finderType\" to \"PageBack\"))\n}\n"
  },
  {
    "path": "finder/kotlin/src/main/kotlin/pro/truongsinh/appium_flutter/finder/serializer.kt",
    "content": "@file:JvmName(\"_FinderRawMethods\")\n@file:JvmMultifileClass\npackage pro.truongsinh.appium_flutter.finder\n\nimport java.util.Base64\n\nimport kotlinx.serialization.*\nimport kotlinx.serialization.json.*\n\nval json = Json(JsonConfiguration.Stable)\nval base64encoder = Base64.getUrlEncoder().withoutPadding()\nval base64decoder = Base64.getUrlDecoder()\n\n@UseExperimental(ImplicitReflectionSerializer::class)\nfun serialize(o: Map<String, *>): String {\n  val jsonStringified = json.stringify(jsonObjectFrom(o))\n  val base64Encoded = base64encoder.encodeToString(jsonStringified.toByteArray())\n  return base64Encoded\n}\n\n@UseExperimental(ImplicitReflectionSerializer::class)\nfun jsonObjectFrom(o: Map<String, *>): Map<String, JsonElement> {\n  return o.map {\n    val jsonO = when (val value = it.value) {\n      is String -> JsonLiteral(value)\n      is Number -> JsonLiteral(value)\n      is Boolean -> JsonLiteral(value)\n      is Map<*, *> -> JsonLiteral(json.stringify(jsonObjectFrom(value as Map<String, *>)))\n      is JsonElement -> value\n      else -> JsonNull\n    }\n    Pair(it.key, jsonO)\n  }.toMap()\n}\n\nfun deserialize(base64Encoded: String): Map<String, *> {\n  val base64Decoded = String(base64decoder.decode(base64Encoded))\n  val jsonObject = json.parseJson(base64Decoded) as JsonObject\n  return jsonObject.toMap()\n}\n"
  },
  {
    "path": "finder/kotlin/src/main/kotlin/pro/truongsinh/appium_flutter/finder/text.kt",
    "content": "@file:JvmName(\"_FinderRawMethods\")\n@file:JvmMultifileClass\npackage pro.truongsinh.appium_flutter.finder\n\nfun text(input: String): FlutterElement {\n  return FlutterElement(mapOf(\n    \"finderType\" to \"ByText\",\n    \"text\" to input\n    ))\n}\n"
  },
  {
    "path": "finder/kotlin/src/test/kotlin/pro/truongsinh/appium_flutter/finder/FinderTest.kt",
    "content": "package pro.truongsinh.appium_flutter.finder\n\nimport java.util.regex.Pattern;\n\nimport org.junit.Assert.assertEquals\nimport org.junit.Test\n\nclass FinderTest {\n    @Test fun TestAncestor() {\n        val expected = \"eyJmaW5kZXJUeXBlIjoiQW5jZXN0b3IiLCJtYXRjaFJvb3QiOiJmYWxzZSIsImZpcnN0TWF0Y2hPbmx5IjoiZmFsc2UiLCJvZiI6IntcImZpbmRlclR5cGVcIjpcIkFuY2VzdG9yXCIsXCJtYXRjaFJvb3RcIjpcImZhbHNlXCIsXCJmaXJzdE1hdGNoT25seVwiOlwiZmFsc2VcIixcIm9mXCI6XCJ7XFxcImZpbmRlclR5cGVcXFwiOlxcXCJQYWdlQmFja1xcXCJ9XCIsXCJtYXRjaGluZ1wiOlwie1xcXCJmaW5kZXJUeXBlXFxcIjpcXFwiUGFnZUJhY2tcXFwifVwifSIsIm1hdGNoaW5nIjoie1wiZmluZGVyVHlwZVwiOlwiQW5jZXN0b3JcIixcIm1hdGNoUm9vdFwiOlwiZmFsc2VcIixcImZpcnN0TWF0Y2hPbmx5XCI6XCJmYWxzZVwiLFwib2ZcIjpcIntcXFwiZmluZGVyVHlwZVxcXCI6XFxcIlBhZ2VCYWNrXFxcIn1cIixcIm1hdGNoaW5nXCI6XCJ7XFxcImZpbmRlclR5cGVcXFwiOlxcXCJQYWdlQmFja1xcXCJ9XCJ9In0\"\n        val observed = ancestor(\n            of = ancestor(\n                of = pageBack(),\n                matching = pageBack()\n            ),\n            matching = ancestor(\n                of = pageBack(),\n                matching = pageBack()\n            )\n        ).id\n        assertEquals(expected, observed)\n    }\n    @Test fun TestBySemanticsLabelString() {\n        assertEquals(\"eyJmaW5kZXJUeXBlIjoiQnlTZW1hbnRpY3NMYWJlbCIsImlzUmVnRXhwIjpmYWxzZSwibGFiZWwiOiJzaW1wbGUifQ\", bySemanticsLabel(\"simple\").id)\n    }\n    @Test fun TestBySemanticsLabelRegex() {\n        assertEquals(\"eyJmaW5kZXJUeXBlIjoiQnlTZW1hbnRpY3NMYWJlbCIsImlzUmVnRXhwIjp0cnVlLCJsYWJlbCI6ImNvbXBsaWNhdGVkIn0\", bySemanticsLabel(Pattern.compile(\"complicated\")).id)\n    }\n    @Test fun TestByTooltip() {\n        assertEquals(\"eyJmaW5kZXJUeXBlIjoiQnlUb29sdGlwTWVzc2FnZSIsInRleHQiOiJteVRleHQifQ\", byTooltip(\"myText\").id)\n    }\n    @Test fun TestByType() {\n        assertEquals(\"eyJmaW5kZXJUeXBlIjoiQnlUeXBlIiwidHlwZSI6Im15VGV4dCJ9\", byType(\"myText\").id)\n    }\n    @Test fun testByValueKeyString() {\n        val expectedJsonElement = deserialize(\"eyJmaW5kZXJUeXBlIjoiQnlWYWx1ZUtleSIsImtleVZhbHVlU3RyaW5nIjoiNDIiLCJrZXlWYWx1ZVR5cGUiOiJTdHJpbmcifQ\")\n        val obserbedJsonElement = deserialize(byValueKey(\"42\").id)\n        assertEquals(true, expectedJsonElement.equals(obserbedJsonElement))\n    }\n    @Test fun testByValueKeyInt() {\n        val expectedJsonElement = deserialize(\"eyJmaW5kZXJUeXBlIjoiQnlWYWx1ZUtleSIsImtleVZhbHVlU3RyaW5nIjo0Miwia2V5VmFsdWVUeXBlIjoiaW50In0\")\n        val obserbedJsonElement = deserialize(byValueKey(42).id)\n        assertEquals(true, expectedJsonElement.equals(obserbedJsonElement))\n    }\n    @Test fun testDescendant() {\n        val expected = \"eyJmaW5kZXJUeXBlIjoiRGVzY2VuZGFudCIsIm1hdGNoUm9vdCI6ImZhbHNlIiwiZmlyc3RNYXRjaE9ubHkiOiJmYWxzZSIsIm9mIjoie1wiZmluZGVyVHlwZVwiOlwiRGVzY2VuZGFudFwiLFwibWF0Y2hSb290XCI6XCJmYWxzZVwiLFwiZmlyc3RNYXRjaE9ubHlcIjpcImZhbHNlXCIsXCJvZlwiOlwie1xcXCJmaW5kZXJUeXBlXFxcIjpcXFwiUGFnZUJhY2tcXFwifVwiLFwibWF0Y2hpbmdcIjpcIntcXFwiZmluZGVyVHlwZVxcXCI6XFxcIlBhZ2VCYWNrXFxcIn1cIn0iLCJtYXRjaGluZyI6IntcImZpbmRlclR5cGVcIjpcIkRlc2NlbmRhbnRcIixcIm1hdGNoUm9vdFwiOlwiZmFsc2VcIixcImZpcnN0TWF0Y2hPbmx5XCI6XCJmYWxzZVwiLFwib2ZcIjpcIntcXFwiZmluZGVyVHlwZVxcXCI6XFxcIlBhZ2VCYWNrXFxcIn1cIixcIm1hdGNoaW5nXCI6XCJ7XFxcImZpbmRlclR5cGVcXFwiOlxcXCJQYWdlQmFja1xcXCJ9XCJ9In0\"\n        val observed = descendant(\n            of = descendant(\n                of = pageBack(),\n                matching = pageBack()\n            ),\n            matching = descendant(\n                of = pageBack(),\n                matching = pageBack()\n            )\n        ).id\n        assertEquals(expected, observed)\n    }\n    @Test fun testPageback() {\n        assertEquals(\"eyJmaW5kZXJUeXBlIjoiUGFnZUJhY2sifQ\", pageBack().id)\n    }\n    @Test fun testText() {\n        assertEquals(\"eyJmaW5kZXJUeXBlIjoiQnlUZXh0IiwidGV4dCI6IlRoaXMgaXMgMm5kIHJvdXRlIn0\", text(\"This is 2nd route\").id)\n    }\n}\n"
  },
  {
    "path": "finder/nodejs/LICENSE",
    "content": "MIT License\n-----------\n\nCopyright (c) 2019 TruongSinh Tran-Nguyen <i@truongsinh.pro>\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "finder/nodejs/README.md",
    "content": "# Appium Flutter Finder\n\nCompanion `finder` for [Appium Flutter Driver](https://www.npmjs.com/package/appium-flutter-driver), that mimics the API of Flutter Driver's [CommonFinders class](https://api.flutter.dev/flutter/flutter_driver/CommonFinders-class.html). All documentation and examples are available in [Appium Flutter Driver package](https://www.npmjs.com/package/appium-flutter-driver).\n\n# Release\n\n```\n$ cd finder/nodejs\n$ npm version <major|minor|patch>\n$ git commit -am 'chore: bump version'\n$ git tag js-finder-<version number> # e.g. git tag js-finder-0.0.23\n$ git push origin js-finder-0.0.23\n$ npm publish\n```\n\n## Changelog\n- 0.2.0\n    - Fix type of `matchRoot` and `firstMatchOnly` in `ancestor` and `descendant`\n- 0.1.0\n  - Add `firstMatchOnly` in `ancestor` and `descendant`\n- 0.0.23\n  - Fix `ancestor` and `descendant`\n"
  },
  {
    "path": "finder/nodejs/lib/base64url.ts",
    "content": "const W3C_ELEMENT: string = `element-6066-11e4-a52e-4f735466cecf`;\nconst MJSON_ELEMENT: string = `ELEMENT`;\n\nexport const encode = (input: string) =>\n  Buffer.from(input)\n    .toString(`base64`)\n    .replace(/=/g, ``)\n    .replace(/\\+/g, `-`)\n    .replace(/\\//g, `_`);\n\nexport const decode = (input: string | {[key: string]: string}) => {\n  let base64String: string = ``;\n  if (typeof input === `string`) {\n    base64String = input;\n  } else if (typeof input === `object` && W3C_ELEMENT in input) {\n    base64String = input[W3C_ELEMENT];\n  } else if (typeof input === `object` && MJSON_ELEMENT in input) {\n    base64String = input[MJSON_ELEMENT];\n  } else {\n    throw new Error(`input is invalid ${JSON.stringify(input)}`);\n  }\n  return Buffer.from(base64String, `base64`).toString();\n};\n"
  },
  {
    "path": "finder/nodejs/lib/base64url_test.ts",
    "content": "import expect from 'expect';\nimport { decode, encode } from './base64url';\n\ndescribe(`base64url`, () => {\n  it(`decode multiple occurrences of +/=`, () => {\n    expect(decode(`1L3Xst+9zp/Gncqt1rXTkde92onGrN6ozq/dpdyX3ZnEu9+TyIhhYQ==`)).toBe(`Խײ߽ΟƝʭֵӑ׽ډƬިίݥܗݙĻߓȈaa`);\n    expect(decode(`1L3Xst-9zp_Gncqt1rXTkde92onGrN6ozq_dpdyX3ZnEu9-TyIhhYQ`)).toBe(`Խײ߽ΟƝʭֵӑ׽ډƬިίݥܗݙĻߓȈaa`);\n  });\n  it(`encode multiple occurrences of +/=`, () => {\n    expect(encode(`Խײ߽ΟƝʭֵӑ׽ډƬިίݥܗݙĻߓȈaa`)).toBe(`1L3Xst-9zp_Gncqt1rXTkde92onGrN6ozq_dpdyX3ZnEu9-TyIhhYQ`);\n  });\n  describe(`decode`, () => {\n    it(`decode MJSONWP element object`, () => {\n      expect(decode({ ELEMENT: `1L3Xst+9zp/Gncqt1rXTkde92onGrN6ozq/dpdyX3ZnEu9+TyIhhYQ==` }))\n        .toBe(`Խײ߽ΟƝʭֵӑ׽ډƬިίݥܗݙĻߓȈaa`);\n    });\n    it(`decode W3C element object`, () => {\n      expect(decode({ 'element-6066-11e4-a52e-4f735466cecf': `1L3Xst+9zp/Gncqt1rXTkde92onGrN6ozq/dpdyX3ZnEu9+TyIhhYQ==` }))\n        .toBe(`Խײ߽ΟƝʭֵӑ׽ډƬިίݥܗݙĻߓȈaa`);\n    });\n    it(`throws Error for strang object`, () => {\n      expect(() => decode({ foo: `bar` })).toThrow();\n    });\n  });\n});\n"
  },
  {
    "path": "finder/nodejs/lib/deserializer.ts",
    "content": "import { decode } from './base64url';\n// @todo consider using protobuf\nexport const deserialize = (base64String: string) =>\n  JSON.parse(decode(base64String));\n"
  },
  {
    "path": "finder/nodejs/lib/serializer.ts",
    "content": "import { encode } from './base64url';\nimport { deserialize } from './deserializer';\n\n// @todo consider using protobuf\nfunction serialize(obj: object) {\n  return encode(JSON.stringify(obj));\n}\n\nexport type SerializableFinder = string;\nexport type Pattern = string | RegExp;\n\nexport const ancestor = (args: {\n  of: SerializableFinder;\n  matching: SerializableFinder;\n  matchRoot?: boolean;\n  firstMatchOnly?: boolean;\n}) => {\n  const { of, matching, matchRoot = false, firstMatchOnly = false} = args;\n  const a: any = {\n    finderType: `Ancestor`,\n    firstMatchOnly: `${firstMatchOnly}`,\n    matchRoot: `${matchRoot}`,\n  };\n  const ofParam: any = {};\n  Object.entries(deserialize(of)).forEach(\n    ([key, value]) => (ofParam[key] = value),\n  );\n  a[`of`] = JSON.stringify(ofParam);\n\n  const matchingPara: any = {};\n  Object.entries(deserialize(matching)).forEach(\n    ([key, value]) => (matchingPara[key] = value),\n  );\n  a[`matching`] = JSON.stringify(matchingPara);\n\n  return serialize(a);\n};\n\nexport const bySemanticsLabel = (label: Pattern) =>\n  serialize({\n    finderType: `BySemanticsLabel`,\n    isRegExp: label instanceof RegExp ? true : false,\n    label: label instanceof RegExp ? label.toString().slice(1, -1) : label,\n  });\n\nexport const byTooltip = (text: string) =>\n  serialize({\n    finderType: `ByTooltipMessage`,\n    text,\n  });\n\nexport const byType = (type: string) =>\n  serialize({\n    finderType: `ByType`,\n    type,\n  });\n\nexport const byValueKey = (key: string | number) =>\n  serialize({\n    finderType: `ByValueKey`,\n    keyValueString: key,\n    keyValueType: typeof key === `string` ? `String` : `int`,\n  });\n\nexport const descendant = (args: {\n  of: SerializableFinder;\n  matching: SerializableFinder;\n  matchRoot?: boolean;\n  firstMatchOnly?: boolean;\n}) => {\n  const { of, matching, matchRoot = false , firstMatchOnly = false} = args;\n  const a: any = {\n    finderType: `Descendant`,\n    firstMatchOnly: `${firstMatchOnly}`,\n    matchRoot: `${matchRoot}`,\n  };\n  const ofParam: any = {};\n  Object.entries(deserialize(of)).forEach(\n    ([key, value]) => (ofParam[key] = value),\n  );\n  a[`of`] = JSON.stringify(ofParam);\n\n  const matchingParam: any = {};\n  Object.entries(deserialize(matching)).forEach(\n    ([key, value]) => (matchingParam[key] = value),\n  );\n  a[`matching`] = JSON.stringify(matchingParam);\n\n  return serialize(a);\n};\n\nexport const pageBack = () =>\n  serialize({\n    finderType: `PageBack`,\n  });\n\nexport const byText = (text: string) =>\n  serialize({\n    finderType: `ByText`,\n    text,\n  });\n"
  },
  {
    "path": "finder/nodejs/lib/serializer_test.ts",
    "content": "// tslint:disable:object-literal-sort-keys\nimport expect from 'expect';\nimport * as find from './serializer';\n\ndescribe(`serializer`, () => {\n  it(`ancestor`, () => {\n    const expected = `eyJmaW5kZXJUeXBlIjoiQW5jZXN0b3IiLCJmaXJzdE1hdGNoT25seSI6InRydWUiLCJtYXRjaFJvb3QiOiJmYWxzZSIsIm9mIjoie1wiZmluZGVyVHlwZVwiOlwiQW5jZXN0b3JcIixcImZpcnN0TWF0Y2hPbmx5XCI6XCJmYWxzZVwiLFwibWF0Y2hSb290XCI6XCJmYWxzZVwiLFwib2ZcIjpcIntcXFwiZmluZGVyVHlwZVxcXCI6XFxcIlBhZ2VCYWNrXFxcIn1cIixcIm1hdGNoaW5nXCI6XCJ7XFxcImZpbmRlclR5cGVcXFwiOlxcXCJQYWdlQmFja1xcXCJ9XCJ9IiwibWF0Y2hpbmciOiJ7XCJmaW5kZXJUeXBlXCI6XCJBbmNlc3RvclwiLFwiZmlyc3RNYXRjaE9ubHlcIjpcImZhbHNlXCIsXCJtYXRjaFJvb3RcIjpcImZhbHNlXCIsXCJvZlwiOlwie1xcXCJmaW5kZXJUeXBlXFxcIjpcXFwiUGFnZUJhY2tcXFwifVwiLFwibWF0Y2hpbmdcIjpcIntcXFwiZmluZGVyVHlwZVxcXCI6XFxcIlBhZ2VCYWNrXFxcIn1cIn0ifQ`;\n    const observed = find.ancestor({\n      of: find.ancestor({\n        of: find.pageBack(),\n        matching: find.pageBack(),\n      }),\n      matching: find.ancestor({\n        of: find.pageBack(),\n        matching: find.pageBack(),\n      }),\n      firstMatchOnly: true,\n    });\n    expect(observed).toBe(expected);\n  });\n  it(`descendant`, () => {\n    const expected = `eyJmaW5kZXJUeXBlIjoiRGVzY2VuZGFudCIsImZpcnN0TWF0Y2hPbmx5IjoiZmFsc2UiLCJtYXRjaFJvb3QiOiJmYWxzZSIsIm9mIjoie1wiZmluZGVyVHlwZVwiOlwiRGVzY2VuZGFudFwiLFwiZmlyc3RNYXRjaE9ubHlcIjpcImZhbHNlXCIsXCJtYXRjaFJvb3RcIjpcImZhbHNlXCIsXCJvZlwiOlwie1xcXCJmaW5kZXJUeXBlXFxcIjpcXFwiUGFnZUJhY2tcXFwifVwiLFwibWF0Y2hpbmdcIjpcIntcXFwiZmluZGVyVHlwZVxcXCI6XFxcIlBhZ2VCYWNrXFxcIn1cIn0iLCJtYXRjaGluZyI6IntcImZpbmRlclR5cGVcIjpcIkRlc2NlbmRhbnRcIixcImZpcnN0TWF0Y2hPbmx5XCI6XCJmYWxzZVwiLFwibWF0Y2hSb290XCI6XCJmYWxzZVwiLFwib2ZcIjpcIntcXFwiZmluZGVyVHlwZVxcXCI6XFxcIlBhZ2VCYWNrXFxcIn1cIixcIm1hdGNoaW5nXCI6XCJ7XFxcImZpbmRlclR5cGVcXFwiOlxcXCJQYWdlQmFja1xcXCJ9XCJ9In0`;\n    const observed = find.descendant({\n      of: find.descendant({\n        of: find.pageBack(),\n        matching: find.pageBack(),\n      }),\n      matching: find.descendant({\n        of: find.pageBack(),\n        matching: find.pageBack(),\n      }),\n    });\n    expect(observed).toBe(expected);\n  });\n  it(`text`, () => {\n    const expected = find.byText(`This is 2nd route`);\n    expect(expected).toBe(\n      `eyJmaW5kZXJUeXBlIjoiQnlUZXh0IiwidGV4dCI6IlRoaXMgaXMgMm5kIHJvdXRlIn0`,\n    );\n  });\n  it(`pageBack`, () => {\n    const expected = find.pageBack();\n    expect(expected).toBe(`eyJmaW5kZXJUeXBlIjoiUGFnZUJhY2sifQ`);\n  });\n  it(`bySemanticsLabel String`, () => {\n    const expected = find.bySemanticsLabel(`simple`);\n    expect(expected).toBe(\n      `eyJmaW5kZXJUeXBlIjoiQnlTZW1hbnRpY3NMYWJlbCIsImlzUmVnRXhwIjpmYWxzZSwibGFiZWwiOiJzaW1wbGUifQ`,\n    );\n  });\n  it(`bySemanticsLabel RegEx`, () => {\n    const expected = find.bySemanticsLabel(/complicated/);\n    expect(expected).toBe(\n      `eyJmaW5kZXJUeXBlIjoiQnlTZW1hbnRpY3NMYWJlbCIsImlzUmVnRXhwIjp0cnVlLCJsYWJlbCI6ImNvbXBsaWNhdGVkIn0`,\n    );\n  });\n  it(`byValueKey String`, () => {\n    const expected = find.byValueKey(`42`);\n    expect(expected).toBe(\n      `eyJmaW5kZXJUeXBlIjoiQnlWYWx1ZUtleSIsImtleVZhbHVlU3RyaW5nIjoiNDIiLCJrZXlWYWx1ZVR5cGUiOiJTdHJpbmcifQ`,\n    );\n  });\n  it(`byValueKey Int`, () => {\n    const expected = find.byValueKey(42);\n    expect(expected).toBe(\n      `eyJmaW5kZXJUeXBlIjoiQnlWYWx1ZUtleSIsImtleVZhbHVlU3RyaW5nIjo0Miwia2V5VmFsdWVUeXBlIjoiaW50In0`,\n    );\n  });\n  it(`byTooltip`, () => {\n    const expected = find.byTooltip(`myText`);\n    expect(expected).toBe(\n      `eyJmaW5kZXJUeXBlIjoiQnlUb29sdGlwTWVzc2FnZSIsInRleHQiOiJteVRleHQifQ`,\n    );\n  });\n  it(`byType`, () => {\n    const expected = find.byType(`myText`);\n    expect(expected).toBe(\n      `eyJmaW5kZXJUeXBlIjoiQnlUeXBlIiwidHlwZSI6Im15VGV4dCJ9`,\n    );\n  });\n});\n"
  },
  {
    "path": "finder/nodejs/package.json",
    "content": "{\n  \"name\": \"appium-flutter-finder\",\n  \"description\": \"Finder for Appium Flutter driver\",\n  \"keywords\": [\n    \"appium\",\n    \"flutter\"\n  ],\n  \"version\": \"0.2.0\",\n  \"author\": \"TruongSinh Tran-Nguyen <i@truongsinh.pro>\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/truongsinh/appium-flutter-driver.git\"\n  },\n  \"main\": \"./build/serializer.js\",\n  \"bin\": {},\n  \"directories\": {\n    \"lib\": \"lib\"\n  },\n  \"files\": [\n    \"build\"\n  ],\n  \"scripts\": {\n    \"test\": \"mocha --require ts-node/register lib/**/*_test.ts\",\n    \"prepublishOnly\": \"cp ../../LICENSE ./\",\n    \"prepare\": \"npm run clean && npm run compile\",\n    \"clean\": \"rm -rf build\",\n    \"compile\": \"tsc\",\n    \"lint\": \"tslint 'lib/**/*.ts'\"\n  },\n  \"devDependencies\": {\n    \"@appium/eslint-config-appium-ts\": \"^3.0.0\",\n    \"@appium/tsconfig\": \"^1.0.0\",\n    \"@types/expect\": \"^24.3.0\",\n    \"@types/mocha\": \"10.0.10\",\n    \"@types/node\": \"^25.0.2\",\n    \"expect\": \"^30.0.0\",\n    \"mocha\": \"^11.0.1\",\n    \"ts-node\": \"^10.9.2\",\n    \"tslint\": \"^6.1.3\",\n    \"typescript\": \"^6.0.3\"\n  }\n}\n"
  },
  {
    "path": "finder/nodejs/tsconfig.json",
    "content": "{\n  \"$schema\": \"https://json.schemastore.org/tsconfig\",\n  \"extends\": \"@appium/tsconfig/tsconfig.json\",\n  \"compilerOptions\": {\n    \"esModuleInterop\": true,\n    \"rootDir\": \".\",\n    \"outDir\": \"build\",\n    \"types\": [\"node\", \"mocha\"],\n    \"checkJs\": true\n  },\n  \"include\": [\"lib\"]\n}"
  },
  {
    "path": "finder/nodejs/tslint.json",
    "content": "{\n    \"defaultSeverity\": \"error\",\n    \"extends\": [\n        \"tslint:recommended\"\n    ],\n    \"jsRules\": {},\n    \"rules\": {\n        \"quotemark\": [true, \"backtick\"]\n    },\n    \"rulesDirectory\": []\n}\n"
  },
  {
    "path": "finder/python/.pylintrc",
    "content": "[MASTER]\n\n# A comma-separated list of package or module names from where C extensions may\n# be loaded. Extensions are loading into the active Python interpreter and may\n# run arbitrary code\nextension-pkg-whitelist=\n\n# Add files or directories to the blacklist. They should be base names, not\n# paths.\nignore=CVS\n\n# Add files or directories matching the regex patterns to the blacklist. The\n# regex matches against base names, not paths.\nignore-patterns=\n\n# Python code to execute, usually for sys.path manipulation such as\n# pygtk.require().\n#init-hook=\n\n# Use multiple processes to speed up Pylint.\njobs=1\n\n# List of plugins (as comma separated values of python modules names) to load,\n# usually to register additional checkers.\nload-plugins=\n\n# Pickle collected data for later comparisons.\npersistent=yes\n\n# Specify a configuration file.\n#rcfile=\n\n# When enabled, pylint would attempt to guess common misconfiguration and emit\n# user-friendly hints instead of false-positive error messages\nsuggestion-mode=yes\n\n# Allow loading of arbitrary C extensions. Extensions are imported into the\n# active Python interpreter and may run arbitrary code.\nunsafe-load-any-extension=no\n\n[MESSAGES CONTROL]\n\n# Only show warnings with the listed confidence levels. Leave empty to show\n# all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED\nconfidence=\n\n# Disable the message, report, category or checker with the given id(s). You\n# can either give multiple identifiers separated by comma (,) or put this\n# option multiple times (only on the command line, not in the configuration\n# file where it should appear only once).You can also use \"--disable=all\" to\n# disable everything first and then reenable specific checks. For example, if\n# you want to run only the similarities checker, you can use \"--disable=all\n# --enable=similarities\". If you want to run only the classes checker, but have\n# no Warning level messages displayed, use\"--disable=all --enable=classes\n# --disable=W\"\ndisable=raw-checker-failed,\n        bad-inline-option,\n        locally-disabled,\n        file-ignored,\n        suppressed-message,\n        useless-suppression,\n        deprecated-pragma,\n        empty-docstring,\n        missing-docstring,\n        too-few-public-methods,\n        invalid-name,\n        duplicate-code,\n        too-many-ancestors,\n        broad-except,\n        line-too-long,\n        super-with-arguments, # TODO: remove when it drops python 2.7\n        useless-object-inheritance # TODO: remove when it drops python 2.7\n\n# Enable the message, report, category or checker with the given id(s). You can\n# either give multiple identifier separated by comma (,) or put this option\n# multiple time (only on the command line, not in the configuration file where\n# it should appear only once). See also the \"--disable\" option for examples.\nenable=c-extension-no-member\n\n\n[REPORTS]\n\n# Python expression which should return a note less than 10 (10 is the highest\n# note). You have access to the variables errors warning, statement which\n# respectively contain the number of errors / warnings messages and the total\n# number of statements analyzed. This is used by the global evaluation report\n# (RP0004).\nevaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10)\n\n# Template used to display messages. This is a python new-style format string\n# used to format the message information. See doc for all details\n#msg-template=\n\n# Set the output format. Available formats are text, parseable, colorized, json\n# and msvs (visual studio).You can also give a reporter class, eg\n# mypackage.mymodule.MyReporterClass.\noutput-format=text\n\n# Tells whether to display a full report or only the messages\nreports=no\n\n# Activate the evaluation score.\nscore=yes\n\n\n[REFACTORING]\n\n# Maximum number of nested blocks for function / method body\nmax-nested-blocks=5\n\n# Complete name of functions that never returns. When checking for\n# inconsistent-return-statements if a never returning function is called then\n# it will be considered as an explicit return statement and no message will be\n# printed.\nnever-returning-functions=optparse.Values,sys.exit\n\n\n[LOGGING]\n\n# Logging modules to check that the string format arguments are in logging\n# function parameter format\nlogging-modules=logging\n\n\n[SPELLING]\n\n# Limits count of emitted suggestions for spelling mistakes\nmax-spelling-suggestions=4\n\n# Spelling dictionary name. Available dictionaries: none. To make it working\n# install python-enchant package.\nspelling-dict=\n\n# List of comma separated words that should not be checked.\nspelling-ignore-words=\n\n# A path to a file that contains private dictionary; one word per line.\nspelling-private-dict-file=\n\n# Tells whether to store unknown words to indicated private dictionary in\n# --spelling-private-dict-file option instead of raising a message.\nspelling-store-unknown-words=no\n\n\n[MISCELLANEOUS]\n\n# List of note tags to take in consideration, separated by a comma.\nnotes=FIXME,\n      XXX,\n      TODO\n\n\n[SIMILARITIES]\n\n# Ignore comments when computing similarities.\nignore-comments=yes\n\n# Ignore docstrings when computing similarities.\nignore-docstrings=yes\n\n# Ignore imports when computing similarities.\nignore-imports=no\n\n# Minimum lines number of a similarity.\nmin-similarity-lines=4\n\n\n[TYPECHECK]\n\n# List of decorators that produce context managers, such as\n# contextlib.contextmanager. Add to this list to register other decorators that\n# produce valid context managers.\ncontextmanager-decorators=contextlib.contextmanager\n\n# List of members which are set dynamically and missed by pylint inference\n# system, and so shouldn't trigger E1101 when accessed. Python regular\n# expressions are accepted.\ngenerated-members=\n\n# Tells whether missing members accessed in mixin class should be ignored. A\n# mixin class is detected if its name ends with \"mixin\" (case insensitive).\nignore-mixin-members=yes\n\n# This flag controls whether pylint should warn about no-member and similar\n# checks whenever an opaque object is returned when inferring. The inference\n# can return multiple potential results while evaluating a Python object, but\n# some branches might not be evaluated, which results in partial inference. In\n# that case, it might be useful to still emit no-member and other checks for\n# the rest of the inferred objects.\nignore-on-opaque-inference=yes\n\n# List of class names for which member attributes should not be checked (useful\n# for classes with dynamically set attributes). This supports the use of\n# qualified names.\nignored-classes=optparse.Values,thread._local,_thread._local\n\n# List of module names for which member attributes should not be checked\n# (useful for modules/projects where namespaces are manipulated during runtime\n# and thus existing member attributes cannot be deduced by static analysis. It\n# supports qualified module names, as well as Unix pattern matching.\nignored-modules=\n\n# Show a hint with possible names when a member name was not found. The aspect\n# of finding the hint is based on edit distance.\nmissing-member-hint=yes\n\n# The minimum edit distance a name should have in order to be considered a\n# similar match for a missing member name.\nmissing-member-hint-distance=1\n\n# The total number of similar names that should be taken in consideration when\n# showing a hint for a missing member.\nmissing-member-max-choices=1\n\n\n[VARIABLES]\n\n# List of additional names supposed to be defined in builtins. Remember that\n# you should avoid to define new builtins when possible.\nadditional-builtins=\n\n# Tells whether unused global variables should be treated as a violation.\nallow-global-unused-variables=yes\n\n# List of strings which can identify a callback function by name. A callback\n# name must start or end with one of those strings.\ncallbacks=cb_,\n          _cb\n\n# A regular expression matching the name of dummy variables (i.e. expectedly\n# not used).\ndummy-variables-rgx=_+$|(_[a-zA-Z0-9_]*[a-zA-Z0-9]+?$)|dummy|^ignored_|^unused_\n\n# Argument names that match this expression will be ignored. Default to name\n# with leading underscore\nignored-argument-names=_.*|^ignored_|^unused_\n\n# Tells whether we should check for unused import in __init__ files.\ninit-import=no\n\n# List of qualified module names which can have objects that can redefine\n# builtins.\nredefining-builtins-modules=six.moves,past.builtins,future.builtins,io,builtins\n\n\n[FORMAT]\n\n# Expected format of line ending, e.g. empty (any line ending), LF or CRLF.\nexpected-line-ending-format=\n\n# Regexp for a line that is allowed to be longer than the limit.\nignore-long-lines=^\\s*(# )?<?https?://\\S+>?$\n\n# Number of spaces of indent required inside a hanging  or continued line.\nindent-after-paren=4\n\n# String used as indentation unit. This is usually \"    \" (4 spaces) or \"\\t\" (1\n# tab).\nindent-string='    '\n\n# Maximum number of characters on a single line.\nmax-line-length=128\n\n# Maximum number of lines in a module\nmax-module-lines=1000\n\n# Allow the body of a class to be on the same line as the declaration if body\n# contains single statement.\nsingle-line-class-stmt=no\n\n# Allow the body of an if to be on the same line as the test if there is no\n# else.\nsingle-line-if-stmt=no\n\n\n[BASIC]\n\n# Naming style matching correct argument names\nargument-naming-style=snake_case\n\n# Regular expression matching correct argument names. Overrides argument-\n# naming-style\n#argument-rgx=\n\n# Naming style matching correct attribute names\nattr-naming-style=snake_case\n\n# Regular expression matching correct attribute names. Overrides attr-naming-\n# style\n#attr-rgx=\n\n# Bad variable names which should always be refused, separated by a comma\nbad-names=foo,\n          bar,\n          baz,\n          toto,\n          tutu,\n          tata\n\n# Naming style matching correct class attribute names\nclass-attribute-naming-style=any\n\n# Regular expression matching correct class attribute names. Overrides class-\n# attribute-naming-style\n#class-attribute-rgx=\n\n# Naming style matching correct class names\nclass-naming-style=PascalCase\n\n# Regular expression matching correct class names. Overrides class-naming-style\n#class-rgx=\n\n# Naming style matching correct constant names\nconst-naming-style=UPPER_CASE\n\n# Regular expression matching correct constant names. Overrides const-naming-\n# style\n#const-rgx=\n\n# Minimum line length for functions/classes that require docstrings, shorter\n# ones are exempt.\ndocstring-min-length=-1\n\n# Naming style matching correct function names\nfunction-naming-style=snake_case\n\n# Regular expression matching correct function names. Overrides function-\n# naming-style\n#function-rgx=\n\n# Good variable names which should always be accepted, separated by a comma\ngood-names=i,\n           j,\n           k,\n           ex,\n           Run,\n           _\n\n# Include a hint for the correct naming format with invalid-name\ninclude-naming-hint=no\n\n# Naming style matching correct inline iteration names\ninlinevar-naming-style=any\n\n# Regular expression matching correct inline iteration names. Overrides\n# inlinevar-naming-style\n#inlinevar-rgx=\n\n# Naming style matching correct method names\nmethod-naming-style=snake_case\n\n# Regular expression matching correct method names. Overrides method-naming-\n# style\n#method-rgx=\n\n# Naming style matching correct module names\nmodule-naming-style=snake_case\n\n# Regular expression matching correct module names. Overrides module-naming-\n# style\n#module-rgx=\n\n# Colon-delimited sets of names that determine each other's naming style when\n# the name regexes allow several styles.\nname-group=\n\n# Regular expression which should only match function or class names that do\n# not require a docstring.\nno-docstring-rgx=^_\n\n# List of decorators that produce properties, such as abc.abstractproperty. Add\n# to this list to register other decorators that produce valid properties.\nproperty-classes=abc.abstractproperty\n\n# Naming style matching correct variable names\nvariable-naming-style=snake_case\n\n# Regular expression matching correct variable names. Overrides variable-\n# naming-style\n#variable-rgx=\n\n\n[DESIGN]\n\n# Maximum number of arguments for function / method\nmax-args=6\n\n# Maximum number of attributes for a class (see R0902).\nmax-attributes=7\n\n# Maximum number of boolean expressions in a if statement\nmax-bool-expr=5\n\n# Maximum number of branch for function / method body\nmax-branches=12\n\n# Maximum number of locals for function / method body\nmax-locals=15\n\n# Maximum number of parents for a class (see R0901).\nmax-parents=7\n\n# Maximum number of public methods for a class (see R0904).\nmax-public-methods=20\n\n# Maximum number of return / yield for function / method body\nmax-returns=6\n\n# Maximum number of statements in function / method body\nmax-statements=50\n\n# Minimum number of public methods for a class (see R0903).\nmin-public-methods=2\n\n\n[CLASSES]\n\n# List of method names used to declare (i.e. assign) instance attributes.\ndefining-attr-methods=__init__,\n                      __new__,\n                      setUp\n\n# List of member names, which should be excluded from the protected access\n# warning.\nexclude-protected=_asdict,\n                  _fields,\n                  _replace,\n                  _source,\n                  _make\n\n# List of valid names for the first argument in a class method.\nvalid-classmethod-first-arg=cls\n\n# List of valid names for the first argument in a metaclass class method.\nvalid-metaclass-classmethod-first-arg=mcs\n\n\n[IMPORTS]\n\n# Allow wildcard imports from modules that define __all__.\nallow-wildcard-with-all=no\n\n# Analyse import fallback blocks. This can be used to support both Python 2 and\n# 3 compatible code, which means that the block might have code that exists\n# only in one or another interpreter, leading to false positives when analysed.\nanalyse-fallback-blocks=yes\n\n# Deprecated modules which should not be used, separated by a comma\ndeprecated-modules=regsub,\n                   TERMIOS,\n                   Bastion,\n                   rexec\n\n# Create a graph of external dependencies in the given file (report RP0402 must\n# not be disabled)\next-import-graph=\n\n# Create a graph of every (i.e. internal and external) dependencies in the\n# given file (report RP0402 must not be disabled)\nimport-graph=\n\n# Create a graph of internal dependencies in the given file (report RP0402 must\n# not be disabled)\nint-import-graph=\n\n# Force import order to recognize a module as part of the standard\n# compatibility libraries.\nknown-standard-library=\n\n# Force import order to recognize a module as part of a third party library.\nknown-third-party=enchant\n\n\n[EXCEPTIONS]\n\n# Exceptions that will emit a warning when being caught. Defaults to\n# \"Exception\"\novergeneral-exceptions=builtins.Exception\n"
  },
  {
    "path": "finder/python/README.md",
    "content": "# Getting the Appium Flutter Finder\n\nThere are three ways to install and use the Appium Flutter Finder.\nSupported Python version follows appium python client.\n\n1. Install from [PyPi](https://pypi.org), as ['Appium-Flutter-Finder'](https://pypi.org/project/Appium-Flutter-Finder/).\n\n    ```shell\n    pip install Appium-Flutter-Finder\n    ```\n\n2. Install from source, via [PyPi](https://pypi.org). From ['Appium-Flutter-Finder'](https://pypi.org/project/Appium-Flutter-Finder/),\ndownload and unarchive the source tarball (Appium-Flutter-Finder-X.X.tar.gz).\n\n    ```shell\n    tar -xvf Appium-Flutter-Finder-X.X.tar.gz\n    cd Appium-Flutter-Finder-X.X\n    python setup.py install\n    ```\n\n3. Install from source via [GitHub](https://github.com/appium/python-client).\n\n    ```shell\n    git clone git@github.com:appium/python-client.git\n    cd python-client\n    python setup.py install\n    ```\n\n# How to use\nExamples can be found out [here](../../example/python/example.py).\n\n# Release\n\n```\npip install twine\n```\n\n```\npython setup.py sdist\ntwine upload dist/Appium-Flutter-Finder-X.X.tar.gz\n```\n\n# Changelog\n- 0.8.0\n    - Update the limit of python appium client version\n- 0.7.0\n    - Update the limit of python appium client version\n- 0.6.1\n    - Fix package\n- 0.6.0\n    - Fix type of `match_root` and `first_match_only` in `by_ancestor` and `by_descendant\n- 0.5.0\n    - Allow Appium-Python-Client to be v3\n- 0.4.0\n    - Bump base Appium-Python-Client to v2\n- 0.3.1\n    - Use Appium-Python-Client 1.x\n- 0.3.0\n    - Add `first_match_only` option in `by_ancestor` and `by_descendant`\n- 0.2.0\n    - Support over Python 3.6\n- 0.1.5\n    - Fix `by_ancestor` and `by_descendant`\n        - https://github.com/truongsinh/appium-flutter-driver/pull/165#issuecomment-877928553\n- 0.1.4\n    - Remove whitespaces from the decoded JSON\n    - Fix `by_ancestor` and `by_descendant`\n- 0.1.3\n    - Allow `from appium_flutter_finder import FlutterElement, FlutterFinder`\n- 0.1.2\n    - Fix b64encode error in Python 3\n- 0.1.1\n    - Initial release\n"
  },
  {
    "path": "finder/python/appium_flutter_finder/__init__.py",
    "content": "from .flutter_finder import FlutterElement, FlutterFinder\n"
  },
  {
    "path": "finder/python/appium_flutter_finder/flutter_finder.py",
    "content": "import base64\nimport json\n\nfrom appium.webdriver.webelement import WebElement\n\n\nclass FlutterElement(WebElement):\n    pass\n\nclass FlutterFinder:\n    def by_ancestor(self, serialized_finder, matching, match_root=False, first_match_only=False):\n        return self._by_ancestor_or_descendant(\n            type_='Ancestor',\n            serialized_finder=serialized_finder,\n            matching=matching,\n            match_root=match_root,\n            first_match_only=first_match_only\n        )\n\n    def by_descendant(self, serialized_finder, matching, match_root=False, first_match_only=False):\n        return self._by_ancestor_or_descendant(\n            type_='Descendant',\n            serialized_finder=serialized_finder,\n            matching=matching,\n            match_root=match_root,\n            first_match_only=first_match_only\n        )\n\n    def by_semantics_label(self, label, isRegExp=False):\n        return self._serialize({\n            'finderType': 'BySemanticsLabel',\n            'isRegExp': isRegExp,\n            'label': label\n        })\n\n    def by_tooltip(self, text):\n        return self._serialize({\n            'finderType': 'ByTooltipMessage',\n            'text': text\n        })\n\n    def by_text(self, text):\n        return self._serialize({\n            'finderType': 'ByText',\n            'text': text\n        })\n\n    def by_type(self, type_):\n        return self._serialize({\n            'finderType': 'ByType',\n            'type': type_\n        })\n\n    def by_value_key(self, key):\n        return self._serialize({\n            'finderType': 'ByValueKey',\n            'keyValueString': key,\n            'keyValueType': 'String' if isinstance(key, str) else 'int'\n        })\n\n    def page_back(self):\n        return self._serialize({\n            'finderType': 'PageBack'\n        })\n\n    def _serialize(self, finder_dict):\n        # type: (dict) -> str\n        return base64.b64encode(\n            bytes(json.dumps(finder_dict, separators=(',', ':')), 'UTF-8')).decode('UTF-8')\n\n    def _by_ancestor_or_descendant(self, type_, serialized_finder, matching, match_root=False, first_match_only=False): # pylint: disable=too-many-positional-arguments\n        param = {'finderType': type_, 'matchRoot': str(match_root).lower(), 'firstMatchOnly': str(first_match_only).lower()}\n\n        try:\n            finder = json.loads(base64.b64decode(\n                serialized_finder).decode('utf-8'))\n        except Exception:\n            finder = {}\n\n        param.setdefault('of', {})\n        for finder_key, finder_value in finder.items():\n            param['of'].setdefault(finder_key, finder_value)\n        param['of'] = json.dumps(param['of'], separators=(',', ':'))\n\n        try:\n            matching = json.loads(base64.b64decode(matching).decode('utf-8'))\n        except Exception:\n            matching = {}\n        param.setdefault('matching', {})\n        for matching_key, matching_value in matching.items():\n            param['matching'].setdefault(matching_key, matching_value)\n        param['matching'] = json.dumps(param['matching'], separators=(',', ':'))\n\n        return self._serialize(param)\n"
  },
  {
    "path": "finder/python/setup.py",
    "content": "#!/usr/bin/env python\n\nimport io\nimport os\n\nfrom setuptools import find_packages, setup\n\nsetup(\n    name='Appium-Flutter-Finder',\n    version='0.8.0',\n    description='An extension of finder for Appium flutter',\n    long_description=io.open(os.path.join(os.path.dirname('__file__'), 'README.md'), encoding='utf-8').read(),\n    long_description_content_type='text/markdown',\n    keywords=[\n        'appium',\n        'flutter',\n        'python client',\n        'mobile automation'\n    ],\n    author='Kazuaki Matsuo',\n    author_email='fly.49.89.over@gmail.com',\n    url='https://github.com/appium/appium-flutter-driver',\n    packages=find_packages(include=['appium_flutter_finder*']),\n    license='MIT',\n    classifiers=[\n        'Development Status :: 5 - Production/Stable',\n        'Programming Language :: Python',\n        'Programming Language :: Python :: 3.7',\n        'Programming Language :: Python :: 3.8',\n        'Programming Language :: Python :: 3.9',\n        'Environment :: Console',\n        'Environment :: MacOS X',\n        'Environment :: Win32 (MS Windows)',\n        'Intended Audience :: Developers',\n        'Intended Audience :: Other Audience',\n        'License :: OSI Approved :: MIT License',\n        'Operating System :: OS Independent',\n        'Topic :: Software Development :: Quality Assurance',\n        'Topic :: Software Development :: Testing'\n    ],\n    install_requires=['Appium-Python-Client >= 2.0.0, < 6']\n)\n"
  },
  {
    "path": "finder/python/tests/__init__.py",
    "content": ""
  },
  {
    "path": "finder/python/tests/flutter_finder_tests.py",
    "content": "import unittest\n\nimport appium_flutter_finder.flutter_finder as finder\n\n\nclass FlutterFinderTest(unittest.TestCase):\n    def test_by_ancestor(self):\n        assert finder.FlutterFinder().by_ancestor(\n            finder.FlutterFinder().by_ancestor(\n                finder.FlutterFinder().page_back(),\n                finder.FlutterFinder().page_back()\n            ),\n            finder.FlutterFinder().by_ancestor(\n                finder.FlutterFinder().page_back(),\n                finder.FlutterFinder().page_back()\n            ),\n            first_match_only=True\n        ) == (\n            'eyJmaW5kZXJUeXBlIjoiQW5jZXN0b3IiLCJtYXRjaFJvb3QiOiJmYWxzZSIsImZpcnN0TWF0Y2hPbmx5IjoidHJ1ZSIsIm9mIjoie1wiZmluZGVyVHlwZVwiOlwiQW5jZXN0b3JcIixcIm1hdGNoUm9vdFwiOlwiZmFsc2VcIixcImZpcnN0TWF0Y2hPbmx5XCI6XCJmYWxzZVwiLFwib2ZcIjpcIntcXFwiZmluZGVyVHlwZVxcXCI6XFxcIlBhZ2VCYWNrXFxcIn1cIixcIm1hdGNoaW5nXCI6XCJ7XFxcImZpbmRlclR5cGVcXFwiOlxcXCJQYWdlQmFja1xcXCJ9XCJ9IiwibWF0Y2hpbmciOiJ7XCJmaW5kZXJUeXBlXCI6XCJBbmNlc3RvclwiLFwibWF0Y2hSb290XCI6XCJmYWxzZVwiLFwiZmlyc3RNYXRjaE9ubHlcIjpcImZhbHNlXCIsXCJvZlwiOlwie1xcXCJmaW5kZXJUeXBlXFxcIjpcXFwiUGFnZUJhY2tcXFwifVwiLFwibWF0Y2hpbmdcIjpcIntcXFwiZmluZGVyVHlwZVxcXCI6XFxcIlBhZ2VCYWNrXFxcIn1cIn0ifQ=='\n        )\n\n    def test_by_descendant(self):\n        assert finder.FlutterFinder().by_descendant(\n            finder.FlutterFinder().by_descendant(\n                finder.FlutterFinder().page_back(),\n                finder.FlutterFinder().page_back()\n            ),\n            finder.FlutterFinder().by_descendant(\n                finder.FlutterFinder().page_back(),\n                finder.FlutterFinder().page_back()\n            )\n        ) == (\n            'eyJmaW5kZXJUeXBlIjoiRGVzY2VuZGFudCIsIm1hdGNoUm9vdCI6ImZhbHNlIiwiZmlyc3RNYXRjaE9ubHkiOiJmYWxzZSIsIm9mIjoie1wiZmluZGVyVHlwZVwiOlwiRGVzY2VuZGFudFwiLFwibWF0Y2hSb290XCI6XCJmYWxzZVwiLFwiZmlyc3RNYXRjaE9ubHlcIjpcImZhbHNlXCIsXCJvZlwiOlwie1xcXCJmaW5kZXJUeXBlXFxcIjpcXFwiUGFnZUJhY2tcXFwifVwiLFwibWF0Y2hpbmdcIjpcIntcXFwiZmluZGVyVHlwZVxcXCI6XFxcIlBhZ2VCYWNrXFxcIn1cIn0iLCJtYXRjaGluZyI6IntcImZpbmRlclR5cGVcIjpcIkRlc2NlbmRhbnRcIixcIm1hdGNoUm9vdFwiOlwiZmFsc2VcIixcImZpcnN0TWF0Y2hPbmx5XCI6XCJmYWxzZVwiLFwib2ZcIjpcIntcXFwiZmluZGVyVHlwZVxcXCI6XFxcIlBhZ2VCYWNrXFxcIn1cIixcIm1hdGNoaW5nXCI6XCJ7XFxcImZpbmRlclR5cGVcXFwiOlxcXCJQYWdlQmFja1xcXCJ9XCJ9In0='\n        )\n\n    def test_by_semantics_label(self):\n        assert finder.FlutterFinder().by_semantics_label('simple') == \\\n            'eyJmaW5kZXJUeXBlIjoiQnlTZW1hbnRpY3NMYWJlbCIsImlzUmVnRXhwIjpmYWxzZSwibGFiZWwiOiJzaW1wbGUifQ=='\n\n    def test_by_semantics_label_regex(self):\n        assert finder.FlutterFinder().by_semantics_label(r'complicated', isRegExp=True) == \\\n            'eyJmaW5kZXJUeXBlIjoiQnlTZW1hbnRpY3NMYWJlbCIsImlzUmVnRXhwIjp0cnVlLCJsYWJlbCI6ImNvbXBsaWNhdGVkIn0='\n\n    def test_by_tooltip(self):\n        assert finder.FlutterFinder().by_tooltip('myText') == \\\n            'eyJmaW5kZXJUeXBlIjoiQnlUb29sdGlwTWVzc2FnZSIsInRleHQiOiJteVRleHQifQ=='\n\n    def test_by_type(self):\n        assert finder.FlutterFinder().by_type('myText') == \\\n            'eyJmaW5kZXJUeXBlIjoiQnlUeXBlIiwidHlwZSI6Im15VGV4dCJ9'\n\n    def test_by_key_value_int(self):\n        assert finder.FlutterFinder().by_value_key(42) == \\\n            'eyJmaW5kZXJUeXBlIjoiQnlWYWx1ZUtleSIsImtleVZhbHVlU3RyaW5nIjo0Miwia2V5VmFsdWVUeXBlIjoiaW50In0='\n\n    def test_by_key_value_string(self):\n        assert finder.FlutterFinder().by_value_key('42') == \\\n            'eyJmaW5kZXJUeXBlIjoiQnlWYWx1ZUtleSIsImtleVZhbHVlU3RyaW5nIjoiNDIiLCJrZXlWYWx1ZVR5cGUiOiJTdHJpbmcifQ=='\n\n    def test_page_back(self):\n        assert finder.FlutterFinder().page_back() == \\\n            'eyJmaW5kZXJUeXBlIjoiUGFnZUJhY2sifQ=='\n\n    def test_by_text(self):\n        assert finder.FlutterFinder().by_text('This is 2nd route') == \\\n            'eyJmaW5kZXJUeXBlIjoiQnlUZXh0IiwidGV4dCI6IlRoaXMgaXMgMm5kIHJvdXRlIn0='\n"
  },
  {
    "path": "finder/ruby/Gemfile",
    "content": "source 'https://rubygems.org'\ngemspec\n\ngem 'minitest', '~> 5.0'\ngem 'rake', '~> 13.0'\n"
  },
  {
    "path": "finder/ruby/README.md",
    "content": "# AppiumFlutterFinder\n\nRuby finder elements for https://github.com/appium/appium-flutter-driver\n\n## Installation\n\nAdd this line to your application's Gemfile:\n\n```ruby\ngem 'appium_flutter_finder'\n```\n\nAnd then execute:\n\n    $ bundle\n\nOr install it yourself as:\n\n    $ gem install appium_flutter_finder\n\n## Usage\n\n\n```ruby\ninclude Appium::Flutter::Finder\n\n@driver = ::Appium::Core.for(caps).start_driver\n\n# Send a request to an element\nelement = Appium::Flutter::Element.new(\n  @driver,\n  finder: by_text('You have pushed the button this many times:')\n)\nassert element.text == 'You have pushed the button this many times:'\n\n# Get render tree by Flutter\n@driver.execute_script 'flutter:getRenderTree', {}\n```\n## Development\n\nAfter checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.\n\nTo install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).\n\n## Changelog\n- 0.8.0\n    - Bump the supported Ruby version to 3.1+ by following core\n- 0.7.1\n    - Update the upper limit of ruby_lib_core\n- 0.7.0\n    - Update the upper limit of ruby_lib_core\n- 0.6.0\n    - Fix type of `match_root` and `first_match_only` in `by_ancestor` and `by_descendant`\n- 0.5.0\n    - Support appium_lib_core version to v7 as well. The appium_lib_core requires Ruby v3.\n- 0.4.2\n    - Relax the dependency version restriction\n- 0.4.1\n    - Add `attr_reader` for `Appium::Flutter::Element#id`\n- 0.4.0\n    - Bump appium_lib_core version to v5+\n- 0.3, 0.3.1\n    - Add `first_match_only` option in `by_ancestor` and `by_descendant`\n- 0.2.1\n    - Fix `by_ancestor` and `by_descendant`\n        - https://github.com/truongsinh/appium-flutter-driver/pull/165#issuecomment-877928553\n- 0.2.0\n    - Bump ruby_lib_core version to 4+\n\n## Contributing\n\nBug reports and pull requests are welcome on GitHub at https://github.com/truongsinh/appium-flutter-driver/tree/main/finder/ruby .\n"
  },
  {
    "path": "finder/ruby/Rakefile",
    "content": "require 'bundler/gem_tasks'\nrequire 'rake/testtask'\n\nRake::TestTask.new(:test) do |t|\n  t.libs << 'test'\n  t.libs << 'lib'\n  t.test_files = FileList['test/**/*_test.rb']\nend\n\ntask default: :test\n"
  },
  {
    "path": "finder/ruby/appium_flutter_finder.gemspec",
    "content": "lib = File.expand_path('lib', __dir__)\n$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)\nrequire 'appium_flutter_finder/version'\n\nGem::Specification.new do |spec|\n  spec.required_ruby_version = Gem::Requirement.new('>= 3.1')\n\n  spec.name          = 'appium_flutter_finder'\n  spec.version       = Appium::Flutter::Finder::VERSION\n  spec.authors       = ['Kazuaki Matsuo']\n  spec.email         = ['fly.49.89.over@gmail.com']\n\n  spec.summary       = 'Finder for appium-flutter-driver'\n  spec.description   = 'Finder for appium-flutter-driver'\n  spec.homepage      = 'https://github.com/truongsinh/appium-flutter-driver'\n\n  # Specify which files should be added to the gem when it is released.\n  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.\n  spec.files         = Dir.chdir(File.expand_path(__dir__)) do\n    `git ls-files -z`.split(\"\\x0\").reject { |f| f.match(%r{^(test|spec|features)/}) }\n  end\n  spec.bindir        = 'exe'\n  spec.executables   = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }\n  spec.require_paths = ['lib']\n\n  spec.add_dependency 'appium_lib_core', '>= 5'\nend\n"
  },
  {
    "path": "finder/ruby/lib/appium_flutter_finder/version.rb",
    "content": "module Appium\n  module Flutter\n    module Finder\n      VERSION = '0.8.0'.freeze\n    end\n  end\nend\n"
  },
  {
    "path": "finder/ruby/lib/appium_flutter_finder.rb",
    "content": "require 'json'\nrequire 'base64'\n\nrequire 'appium_lib_core'\nrequire 'appium_flutter_finder/version'\n\nmodule Appium\n  module Flutter\n\n    # Handles flutter elements as Appium Elements\n    class Element < ::Selenium::WebDriver::Element\n      attr_reader :id\n\n      def initialize(driver, finder:)\n        @bridge = driver.bridge\n        @id = finder\n      end\n    end\n\n    # Get find element context for flutter driver\n    module Finder\n      def by_ancestor(serialized_finder:, matching:, match_root: false, first_match_only: false)\n        by_ancestor_or_descendant(\n          type: 'Ancestor',\n          serialized_finder: serialized_finder,\n          matching: matching,\n          match_root: match_root,\n          first_match_only: first_match_only\n        )\n      end\n\n      def by_descendant(serialized_finder:, matching:, match_root: false, first_match_only: false)\n        by_ancestor_or_descendant(\n          type: 'Descendant',\n          serialized_finder: serialized_finder,\n          matching: matching,\n          match_root: match_root,\n          first_match_only: first_match_only\n        )\n      end\n\n      def by_semantics_label(label)\n        serialize(\n          finderType: 'BySemanticsLabel',\n          isRegExp: label.is_a?(Regexp),\n          # Should be '/a/' as String in regex case\n          label: label.is_a?(Regexp) ? label.source : label\n        )\n      end\n\n      def by_tooltip(text)\n        serialize(\n          finderType: 'ByTooltipMessage',\n          text: text\n        )\n      end\n\n      def by_type(type)\n        serialize(\n          finderType: 'ByType',\n          type: type\n        )\n      end\n\n      def by_value_key(key)\n        serialize(\n          finderType: 'ByValueKey',\n          keyValueString: key,\n          keyValueType: key.is_a?(String) ? 'String' : 'int'\n        )\n      end\n\n      def page_back\n        serialize(\n          finderType: 'PageBack'\n        )\n      end\n\n      def by_text(text)\n        serialize(\n          finderType: 'ByText',\n          text: text\n        )\n      end\n\n      private\n\n      def serialize(hash)\n        Base64.strict_encode64(hash.to_json)\n      end\n\n      def by_ancestor_or_descendant(type:, serialized_finder:, matching:, match_root: false, first_match_only: false)\n        param = { finderType: type, matchRoot: match_root.to_s, firstMatchOnly: first_match_only.to_s}\n\n        finder = begin\n          JSON.parse(Base64.decode64(serialized_finder))\n        rescue JSONError\n          {}\n        end\n\n        of_param = {}\n        finder.each_key do |key|\n          of_param[key] = finder[key]\n        end\n        param['of'] = of_param.to_json\n\n        matching = begin\n          JSON.parse(Base64.decode64(matching))\n        rescue JSONError\n          {}\n        end\n\n        matching_param = {}\n        matching.each_key do |key|\n          matching_param[key] = matching[key]\n        end\n        param['matching'] = matching_param.to_json\n\n        serialize param\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "finder/ruby/test/appium_flutter_finder_test.rb",
    "content": "require 'test_helper'\nrequire_relative '../lib/appium_flutter_finder'\n\nclass AppiumFlutterFinderTest < Minitest::Test\n  include Appium::Flutter::Finder\n\n  def test_by_ancestor\n    assert_equal(\n      'eyJmaW5kZXJUeXBlIjoiQW5jZXN0b3IiLCJtYXRjaFJvb3QiOiJmYWxzZSIsImZpcnN0TWF0Y2hPbmx5IjoidHJ1ZSIsIm9mIjoie1wiZmluZGVyVHlwZVwiOlwiQW5jZXN0b3JcIixcIm1hdGNoUm9vdFwiOlwiZmFsc2VcIixcImZpcnN0TWF0Y2hPbmx5XCI6XCJmYWxzZVwiLFwib2ZcIjpcIntcXFwiZmluZGVyVHlwZVxcXCI6XFxcIlBhZ2VCYWNrXFxcIn1cIixcIm1hdGNoaW5nXCI6XCJ7XFxcImZpbmRlclR5cGVcXFwiOlxcXCJQYWdlQmFja1xcXCJ9XCJ9IiwibWF0Y2hpbmciOiJ7XCJmaW5kZXJUeXBlXCI6XCJBbmNlc3RvclwiLFwibWF0Y2hSb290XCI6XCJmYWxzZVwiLFwiZmlyc3RNYXRjaE9ubHlcIjpcImZhbHNlXCIsXCJvZlwiOlwie1xcXCJmaW5kZXJUeXBlXFxcIjpcXFwiUGFnZUJhY2tcXFwifVwiLFwibWF0Y2hpbmdcIjpcIntcXFwiZmluZGVyVHlwZVxcXCI6XFxcIlBhZ2VCYWNrXFxcIn1cIn0ifQ==',\n      by_ancestor(\n        serialized_finder: by_ancestor(\n          serialized_finder: page_back,\n          matching: page_back\n        ),\n        matching: by_ancestor(\n          serialized_finder: page_back,\n          matching: page_back\n        ),\n        first_match_only: true\n      )\n    )\n  end\n\n  def test_by_descendant\n    assert_equal(\n      'eyJmaW5kZXJUeXBlIjoiRGVzY2VuZGFudCIsIm1hdGNoUm9vdCI6ImZhbHNlIiwiZmlyc3RNYXRjaE9ubHkiOiJmYWxzZSIsIm9mIjoie1wiZmluZGVyVHlwZVwiOlwiRGVzY2VuZGFudFwiLFwibWF0Y2hSb290XCI6XCJmYWxzZVwiLFwiZmlyc3RNYXRjaE9ubHlcIjpcImZhbHNlXCIsXCJvZlwiOlwie1xcXCJmaW5kZXJUeXBlXFxcIjpcXFwiUGFnZUJhY2tcXFwifVwiLFwibWF0Y2hpbmdcIjpcIntcXFwiZmluZGVyVHlwZVxcXCI6XFxcIlBhZ2VCYWNrXFxcIn1cIn0iLCJtYXRjaGluZyI6IntcImZpbmRlclR5cGVcIjpcIkRlc2NlbmRhbnRcIixcIm1hdGNoUm9vdFwiOlwiZmFsc2VcIixcImZpcnN0TWF0Y2hPbmx5XCI6XCJmYWxzZVwiLFwib2ZcIjpcIntcXFwiZmluZGVyVHlwZVxcXCI6XFxcIlBhZ2VCYWNrXFxcIn1cIixcIm1hdGNoaW5nXCI6XCJ7XFxcImZpbmRlclR5cGVcXFwiOlxcXCJQYWdlQmFja1xcXCJ9XCJ9In0=',\n      by_descendant(\n        serialized_finder: by_descendant(\n          serialized_finder: page_back,\n          matching: page_back\n        ),\n        matching: by_descendant(\n          serialized_finder: page_back,\n          matching: page_back\n        )\n      )\n    )\n  end\n\n  def test_by_semantics_label\n    assert_equal(\n      'eyJmaW5kZXJUeXBlIjoiQnlTZW1hbnRpY3NMYWJlbCIsImlzUmVnRXhwIjpmYWxzZSwibGFiZWwiOiJzaW1wbGUifQ==',\n      by_semantics_label('simple')\n    )\n  end\n\n  def test_by_semantics_label_regex\n    assert_equal(\n      'eyJmaW5kZXJUeXBlIjoiQnlTZW1hbnRpY3NMYWJlbCIsImlzUmVnRXhwIjp0cnVlLCJsYWJlbCI6ImNvbXBsaWNhdGVkIn0=',\n      by_semantics_label(/complicated/)\n    )\n  end\n\n  def test_by_tooltip\n    assert_equal(\n      'eyJmaW5kZXJUeXBlIjoiQnlUb29sdGlwTWVzc2FnZSIsInRleHQiOiJteVRleHQifQ==',\n      by_tooltip('myText')\n    )\n  end\n\n  def test_by_type\n    assert_equal(\n      'eyJmaW5kZXJUeXBlIjoiQnlUeXBlIiwidHlwZSI6Im15VGV4dCJ9',\n      by_type('myText')\n    )\n  end\n\n  def test_by_key_value_int\n    assert_equal(\n      'eyJmaW5kZXJUeXBlIjoiQnlWYWx1ZUtleSIsImtleVZhbHVlU3RyaW5nIjo0Miwia2V5VmFsdWVUeXBlIjoiaW50In0=',\n      by_value_key(42)\n    )\n  end\n\n  def test_by_key_value_string\n    assert_equal(\n      'eyJmaW5kZXJUeXBlIjoiQnlWYWx1ZUtleSIsImtleVZhbHVlU3RyaW5nIjoiNDIiLCJrZXlWYWx1ZVR5cGUiOiJTdHJpbmcifQ==',\n      by_value_key('42')\n    )\n  end\n\n  def test_page_back\n    assert_equal 'eyJmaW5kZXJUeXBlIjoiUGFnZUJhY2sifQ==', page_back\n  end\n\n  def test_by_text\n    assert_equal(\n      'eyJmaW5kZXJUeXBlIjoiQnlUZXh0IiwidGV4dCI6IlRoaXMgaXMgMm5kIHJvdXRlIn0=',\n      by_text('This is 2nd route')\n    )\n  end\nend\n"
  },
  {
    "path": "finder/ruby/test/test_helper.rb",
    "content": "$LOAD_PATH.unshift File.expand_path('../lib', __dir__)\nrequire 'appium_flutter_finder'\n\nrequire 'minitest/autorun'\n"
  },
  {
    "path": "finder/spec.json",
    "content": "{\n  \"ancestor\": \"eyJmaW5kZXJUeXBlIjoiQW5jZXN0b3IiLCJtYXRjaFJvb3QiOmZhbHNlLCJvZl9maW5kZXJUeXBlIjoiQnlTZW1hbnRpY3NMYWJlbCIsIm9mX2lzUmVnRXhwIjp0cnVlLCJvZl9sYWJlbCI6ImNvdW50ZXJfc2VtYW50aWMiLCJtYXRjaGluZ19maW5kZXJUeXBlIjoiQnlUeXBlIiwibWF0Y2hpbmdfdHlwZSI6IlRvb2x0aXAifQ\"\n}\n"
  },
  {
    "path": "jitpack.yml",
    "content": "jdk:\n  - openjdk11\ninstall:\n  - cd finder/kotlin\n  - ./gradlew publishToMavenLocal\n\n"
  }
]